在pandas数据框列中存储不同值的最佳方法?

时间:2019-12-03 20:42:18

标签: python pandas dataframe

我很难找出最好或最简单的方法来在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

是否存在一种简单的方法来聚合这些形式的多个数据框?

3 个答案:

答案 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()

您需要指定索引,左,内,右。 enter image description here

Src:Merge DF

如果这看起来像您想要的,我可以继续回答。