我有几个系列变量要连接(沿轴=1(以创建DataFrame。我希望系列的名称在DataFrame中显示为列名。我已经想出了几种方法来做到这一点。
在我看来,最直观的方法是:
import pandas as pd
x1 = pd.Series([1,2,3],name='x1')
x2 = pd.Series([11,12,13],name='x2')
df = pd.DataFrame([x1,x2])
print(df)
但是,不是将序列名作为列标题,而是将序列数据用作DataFrame中的行。
0 1 2
x1 1 2 3
x2 11 12 13
这让我觉得违背直觉有两个原因。
序列中的数据可能是一种类型的数据,即股价、时间序列数据等。因此,序列数据应该是DataFrame中的一列,而不是一行,这似乎很直观。
从现有DataFrame中提取列作为序列时,列名将用作序列的名称。
示例:
df = pd.DataFrame({'x1' : [1,2,3], 'x2' : [4,5,6]})
print(type(df['x1']))
print(df['x1'].name)
<class 'pandas.core.series.Series'>
x1
那么,在从序列构造DataFrame时,为什么不将名称用作列标题呢?``
我总是可以从字典中构造一个DataFrame来获得我想要的结果:
df = pd.DataFrame({'x1' : x1, 'x2' : x2})
print(df)
x1 x2
0 1 11
1 2 12
2 3 13
但这让我觉得很尴尬,因为我必须复制系列的名称(或者至少在词典的结构中引用它们(。
另一方面,Pandasconcat
方法实现了我所期望的默认行为:
df = pd.concat([x1,x2],axis=1)
print(df)
x1 x2
0 1 11
1 2 12
2 3 13
所以,我的问题是,当从系列变量列表构建DataFrame时,为什么concat
的行为不是默认行为?
x1 = pd.Series([1,2,3],name='x1')
x2 = pd.Series([11,12,13],name='x2')
df = pd.DataFrame([x1,x2]).transpose()
>>> df
x1 x2
0 1 11
1 2 12
2 3 13
因为pd.DataFrame
不会为您生成zip
:
>>> pd.DataFrame(zip(x1, x2), columns=[x1.name, x2.name])
x1 x2
0 1 11
1 2 12
2 3 13