我正在尝试创建一个看起来像这样的熊猫df:
AAA BBB CCC
0 4 10 100
1 4 20 50
2 5 30 -30
3 5 40 -50
要实现,我现在要创建两个数据框
df1 = pd.DataFrame({'AAA' : [4] * 2 , 'BBB' : [10,20], 'CCC' : [100,50]})
df2 = pd.DataFrame({'AAA': [5]*2, 'BBB' : [30,40],'CCC' : [-30,-50]})
,然后将df2的行附加到df1以创建所需的df
我试图做
df = pd.DataFrame({'AAA' : [4] * 2, 'AAA': [5]*2, 'BBB' :
[10,20,30,40],'CCC' : [100,50,-30,-50]}); df
但是关键消息出现错误:
ValueError('数组必须都具有相同的长度')ValueError:数组必须 长度都一样
我当然可以做:
df = pd.DataFrame({'AAA' : [4,4,5,5], 'BBB' : [10,20,30,40],'CCC' :
[100,50,-30,-50]}); df
但是,没有别的优雅的方法可以做到这一点吗?这个小例子很容易实现,但是如果我想扩展到很多行,输入将变得很长。
答案 0 :(得分:4)
我相信您需要+
之前的加入列表:
df = pd.DataFrame({'AAA' : [4]*2 + [5]*2, 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})
print (df)
AAA BBB CCC
0 4 10 100
1 4 20 50
2 5 30 -30
3 5 40 -50
或将repeat
与concatenate
一起使用:
df = pd.DataFrame({'AAA' : np.concatenate([np.repeat(4, 2), np.repeat(5, 2)]),
'BBB' : [10,20,30,40],
'CCC' : [100,50,-30,-50]})
替代:
df = pd.DataFrame({'AAA' : np.repeat((4,5), (2, 2)),
'BBB' : [10,20,30,40],
'CCC' : [100,50,-30,-50]})
print (df)
AAA BBB CCC
0 4 10 100
1 4 20 50
2 5 30 -30
3 5 40 -50
答案 1 :(得分:1)
对于一般解决方案,您可以执行以下操作:
import pandas as pd
data = [(4, 2), (5, 2)]
df = pd.DataFrame({'AAA' : [value for value, reps in data for _ in range(reps)], 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]})
print(df)
如果数据是值列表,则重复元组。因此,对于您的特定示例,您有4个重复2个和5个重复2个,因此[(4, 2), (5, 2)]
。
答案 2 :(得分:1)
您得到的错误非常清楚。从字典创建数据框时,所有数组的长度必须相同。创建字典时,如果多次输入相同的键,则使用最后一个。所以
{'AAA' : [4] * 2, 'AAA': [5]*2, 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}
与
相同{'AAA': [5]*2, 'BBB' : [10,20,30,40],'CCC' : [100,50,-30,-50]}
当您尝试从该词典创建数据框时,您需要一列2行和2列4行,因此会出现错误。正如@jezrael所指出的,您可以通过加入列表,然后从该列表创建数据框,来为AAA创建所需的列。