Pandas:从系列创建数据帧



我有几个系列变量要连接(沿轴=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

最新更新