Python Pandas 数据框创建
Posted
技术标签:
【中文标题】Python Pandas 数据框创建【英文标题】:Python Pandas Data frame creation 【发布时间】:2018-03-15 16:57:31 【问题描述】:我尝试使用以下代码创建数据框 df:
import numpy as np
import pandas as pd
index = [0,1,2,3,4,5]
s = pd.Series([1,2,3,4,5,6],index= index)
t = pd.Series([2,4,6,8,10,12],index= index)
df = pd.DataFrame(s,columns = ["MUL1"])
df["MUL2"] =t
print df
MUL1 MUL2
0 1 2
1 2 4
2 3 6
3 4 8
4 5 10
5 6 12
在尝试使用以下语法创建相同的数据框时,我得到了一个奇怪的输出。
df = pd.DataFrame([s,t],columns = ["MUL1","MUL2"])
print df
MUL1 MUL2
0 NaN NaN
1 NaN NaN
请解释为什么当两个系列都非空时 NaN 会显示在数据框中,以及为什么只显示两行而没有其他行。
还通过使用 pandas DataFrame 方法中的 columns 参数,提供创建数据框的正确方法,就像上面提到的一样。
【问题讨论】:
【参考方案1】:正确的方法之一是将输入列表中的数组数据堆叠成列 -
In [161]: pd.DataFrame(np.c_[s,t],columns = ["MUL1","MUL2"])
Out[161]:
MUL1 MUL2
0 1 2
1 2 4
2 3 6
3 4 8
4 5 10
5 6 12
在幕后,堆叠创建了一个二维数组,然后将其转换为数据帧。这是堆叠数组的样子 -
In [162]: np.c_[s,t]
Out[162]:
array([[ 1, 2],
[ 2, 4],
[ 3, 6],
[ 4, 8],
[ 5, 10],
[ 6, 12]])
【讨论】:
非常感谢您的回答先生。但我有一个小问题。使用的系列 s 和 t 是可以通过打印其中之一来确定的列,例如打印 0 1 1 2 2 3 3 4 4 5 5 6 数据类型:int64。那么为什么我们必须明确使用 np.c_ 将它们转换为列? @SarvagyaDubeys
和 t
是 pandas 系列,很可能它们的索引在使用 [s,t]
创建数据框时会搞砸。通过堆叠,它为我们提供了数组数据,因为我们正在摆脱这些索引。这有助于我们获得与其先前索引信息无关的所需数据框。
嗯。我认为如果输入是系列不是很好的方法转换为 numpy 数组,因为丢失了index
信息。特别是如果每个系列都有不同的索引,您的解决方案就会失败。你怎么看?
您的解决方案仅在默认索引或与pd.DataFrame(np.c_[s,t],columns = ["MUL1","MUL2"], index=s.index)
相同的情况下才有效
@jezrael 我认为 OP 希望从 s
和 t
获取与索引信息无关的数据以创建输出数据帧。如果他们需要处理这种情况/预期输出的情况,我会让 OP 澄清一下。【参考方案2】:
如果删除列参数得到:
df = pd.DataFrame([s,t])
print (df)
0 1 2 3 4 5
0 1 2 3 4 5 6
1 2 4 6 8 10 12
然后定义列 - 如果列不存在,则获取 NaNs 列:
df = pd.DataFrame([s,t], columns=[0,'MUL2'])
print (df)
0 MUL2
0 1.0 NaN
1 2.0 NaN
最好使用dictionary
:
df = pd.DataFrame('MUL1':s,'MUL2':t)
print (df)
MUL1 MUL2
0 1 2
1 2 4
2 3 6
3 4 8
4 5 10
5 6 12
如果需要更改列顺序添加列参数:
df = pd.DataFrame('MUL1':s,'MUL2':t, columns=['MUL2','MUL1'])
print (df)
MUL2 MUL1
0 2 1
1 4 2
2 6 3
3 8 4
4 10 5
5 12 6
更多信息在dataframe documentation。
不需要concat
- DataFrame
构造函数的另一个解决方案:
df = pd.concat([s,t], axis=1, keys=['MUL1','MUL2'])
print (df)
MUL1 MUL2
0 1 2
1 2 4
2 3 6
3 4 8
4 5 10
5 6 12
【讨论】:
我打算在不使用字典的情况下创建数据框。 我添加了另一个解决方案 - 不需要 DataFrame 构造函数。 非常感谢您的帮助 @jezrael 谢谢伙计,你是个救命稻草,有这么多有用的答案:)【参考方案3】:pandas.DataFrame 接受参数 data,其类型可以是 ndarray、iterable、dict 或 dataframe。 如果您传入一个列表,它将假定每个成员都是一行。示例:
a = [1,2,3]
b = [2,4,6]
df = pd.DataFrame([a, b], columns = ["Col1","Col2", "Col3"])
# output 1:
Col1 Col2 Col3
0 1 2 3
1 2 4 6
你得到NaN
,因为它期望index = [0,1]
,但你给[0,1,2,3,4,5]
要得到你想要的形状,先转置数据:
data = np.array([a, b]).transpose()
如何创建 pandas 数据框
import pandas as pd
a = [1,2,3]
b = [2,4,6]
df = pd.DataFrame(dict(Col1=a, Col2=b))
输出:
Col1 Col2
0 1 2
1 2 4
2 3 6
【讨论】:
以上是关于Python Pandas 数据框创建的主要内容,如果未能解决你的问题,请参考以下文章
如何在 python 中使用 Pandas 数据框顺序创建和保存 csv 文件
python postgresql从pandas数据框创建数据库并填充表
根据其他列中的值在 python 3 (pandas) 数据框中创建新列