Python Pandas数据框创建

velaa5lx  于 2023-05-12  发布在  Python
关注(0)|答案(4)|浏览(95)

我尝试使用以下代码创建 Dataframe 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

在尝试使用下面的语法创建相同的 Dataframe 时,我得到了一个wierd输出。

df = pd.DataFrame([s,t],columns = ["MUL1","MUL2"])

print df

   MUL1  MUL2
0   NaN   NaN
1   NaN   NaN

请解释为什么当两个系列都不为空时,NaN显示在数据框中,以及为什么只有两行显示而其余的都不显示。
还提供了创建数据框架的正确方法,与上面提到的方法相同,即在pandas DataFrame方法中使用columns参数。

ohtdti5x

ohtdti5x1#

正确的方法之一是将包含这些序列的输入列表中的数组数据堆叠到列中-

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数组,然后将其转换为 Dataframe 。这是堆叠阵列的样子-

In [162]: np.c_[s,t]
Out[162]: 
array([[ 1,  2],
       [ 2,  4],
       [ 3,  6],
       [ 4,  8],
       [ 5, 10],
       [ 6, 12]])
cgyqldqp

cgyqldqp2#

如果删除列参数,则获取:

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文档中。
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
pbgvytdp

pbgvytdp3#

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
daupos2t

daupos2t4#

显示NaN值是因为您尝试使用2行的2x6数组创建数据框(s,t)和6列(每个系列的值),但是,您定义了一个具有2列[“MUL1”,“MUL2”]和2行[s,t]的 Dataframe ,因此输出将是一个2x2数组,由于您有6个值而不是2个值,因此没有正确的信息(2列通过,但通过的数据有6个值)。解决这个问题的一种方法是转置序列,这样你就有了正确的输出。
对于这种情况,我编写代码的方式如下:

import numpy as np
import pandas as pd

index = [0,1,2,3,4,5]

columns = ['MUL1', 'MUL2']

s = [1,2,3,4,5,6] 
t = [2,4,6,8,10,12]

df = pd.DataFrame(np.transpose([s,t]), columns = columns, index = index)

print(df)

输出:

MUL1  MUL2
0     1     2
1     2     4
2     3     6
3     4     8
4     5    10
5     6    12

同样的结果将是创建2x6数组(称为“行”)并转置它:

rows = [s,t]

df = pd.DataFrame(np.transpose(rows), columns = columns, index = index)

使用的Python和库版本:

Python 3.11 
NumPy 1.24
Pandas 2.0.1

我知道这是一个古老的主题,但我希望这对某人有用。

相关问题