我很难找出最好或最简单的方法来在pandas列中存储有关同一实体的多个数据,例如,我有一些如下所示的pandas数据框:
a b c
item0 2.0 NaN 1.1
item1 1.3 2.2 2.0
item2 1.4 NaN NaN
a b c
item0 foo bar bar
item1 bar foo bar
item2 foo foo bar
我想将这些数据框值聚合为一个,但我未能成功将它们分配给多索引数据框,这是我希望得到的:
a b c
item0 {prop1:2.0, prop2: foo} {prop1:NaN, prop2: bar} {prop1:1.1, prop2: bar}
item1 {prop1:1.3, prop2: bar} {prop1:2.2, prop2: foo} {prop1:2.0, prop2: bar}
item2 {prop1:1.4, prop2: foo} {prop1:NaN, prop2: foo} {prop1:NaN, prop2: bar}
或
a b c
prop1 prop2 prop1 prop2 prop1 prop2
item0 2.0 foo NaN bar 1.1 bar
item1 1.3 bar 2.2 foo 2.0 bar
item2 1.4 foo NaN foo NaN bar
是否存在一种简单的方法来聚合这些形式的多个数据框?
答案 0 :(得分:2)
第二个选项更可取。将对象存储在字典中时,pandas
效率会大大降低。基本的操作也会变得更加困难。
由于对齐方式位于索引上,因此它与concat
参数只是keys
。然后,如果您想将prop
放在底部,则可以交换级别。
res = (pd.concat([df1, df2], axis=1, keys=['prop1', 'prop2'])
.swaplevel(0,1, axis=1)
.sort_index(axis=1))
print(res)
a b c
prop1 prop2 prop1 prop2 prop1 prop2
item0 2.0 foo NaN bar 1.1 bar
item1 1.3 bar 2.2 foo 2.0 bar
item2 1.4 foo NaN foo NaN bar
答案 1 :(得分:1)
df1 = pd.DataFrame(
{'a': [2., 1.3, 1.4], 'b': [np.nan, 2.2, np.nan], 'c': [1.1, 2., np.nan]},
index=['item0', 'item1', 'item2']
)
df2 = pd.DataFrame(
{'a': ['foo', 'bar', 'foo'], 'b': ['bar', 'foo', 'foo'], 'c': ['bar'] * 3},
index=['item0', 'item1', 'item2']
)
df1.columns = pd.MultiIndex.from_product([df1, ['prop1']])
df2.columns = pd.MultiIndex.from_product([df2, ['prop2']])
>>> pd.concat([df1, df2], axis=1).sort_index(axis=1, level=0)
a b c
prop1 prop2 prop1 prop2 prop1 prop2
item0 2.0 foo NaN bar 1.1 bar
item1 1.3 bar 2.2 foo 2.0 bar
item2 1.4 foo NaN foo NaN bar
或者,连接数据框(假设它们具有相同的列),分配新的多索引,然后再恢复原始顺序:
df = pd.concat([df1, df2], axis=1)
df.columns = pd.MultiIndex.from_tuples(product(['prop1', 'prop2'], df1))
df = df.swaplevel(0, 1, axis=1)[product(df1, ['prop1', 'prop2'])]
或按照@ALollz使用的keys
参数:
keys = ['prop1', 'prop2']
df = pd.concat([df1, df2], axis=1, keys=keys)
df = df.swaplevel(0, 1, axis=1)[product(df1, keys)]
答案 2 :(得分:0)
是否存在一种简单的方法来聚合这些形式的多个数据框?
据我所知,您正在尝试找出要用于聚合或合并多个DataFrame的索引。
Pandas
提供了三种方式,concat()
,merge()
,join()
Src:Merge DF
如果这看起来像您想要的,我可以继续回答。