熊猫:从系列创建数据帧

时间:2021-05-02 17:56:56

标签: python pandas dataframe

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

这让我觉得有悖常理,原因有二。

  • Series 中的数据很可能都是一种类型的数据,即股票价格、时间序列数据等。因此,Series 数据应该是一列而不是一行,这似乎很直观,在数据框中。

  • 当从现有 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

那么为什么在从 Series 构造 DataFrame 时不将名称用作列标题?```

我总是可以从字典中构造一个 DataFrame 来得到我想要的结果:

df = pd.DataFrame({'x1' : x1, 'x2' : x2})
print(df)

   x1  x2
0   1  11
1   2  12
2   3  13

但这让我觉得很尴尬,因为我必须复制系列的名称(或者至少在构建字典时参考它们)。

另一方面,Pandas concat 方法执行我对默认行为的期望:

df = pd.concat([x1,x2],axis=1)
print(df)

   x1  x2
0   1  11
1   2  12
2   3  13

那么,我的问题是,当从一系列变量列表构造 DataFrame 时,为什么我使用 concat 获得的行为不是默认行为?

1 个答案:

答案 0 :(得分:1)

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