我尝试使用以下代码创建数据框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参数创建数据框的正确方法,如上所述。
答案 0 :(得分:6)
正确的方法之一是将输入列表中的数组数据堆叠成列 -
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
在幕后,堆叠会创建一个2D数组,然后将其转换为数据帧。这是堆叠阵列的样子 -
In [162]: np.c_[s,t]
Out[162]:
array([[ 1, 2],
[ 2, 4],
[ 3, 6],
[ 4, 8],
[ 5, 10],
[ 6, 12]])
答案 1 :(得分:3)
如果删除列参数get:
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
答案 2 :(得分:0)
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()
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