合并熊猫数据框以创建重复匹配项的列表

时间:2019-02-27 09:53:56

标签: python-3.x pandas dataframe

我有两个数据框:

df1 = pd.DataFrame([['ida', 1], ['idb', 2], ['idc', 3]], columns=['A','B'])
df2 = pd.DataFrame([['idb', 20], ['ida', 10], ['idb', 21], ['idb', 22]], columns=['A', 'C'])

,我想将df2df1 的数据附加到列表中

df3 = 
  |A   B  C
---------------
0 |ida 1  [10]
1 |idb 2  [20, 21, 22]
2 |idc 3  NaN

我可以合并两个框架:

df1.merge(df2, how='left')
     A  B     C
0  ida  1  10.0
1  idb  2  20.0
2  idb  2  21.0
3  idb  2  22.0
4  idc  3   NaN

但是我如何“合并”匹配的行?而且,实际上df2大很多,我只想复制列“ C”,而不是列“ D”,“ E”,“ F” ...

或者,我可以在df1中创建一个新列,然后遍历df2来填充它:

for n, row in df2.iterrows():
    idx = df1.index[row['A'] == df1['A']]
    for i in idx:  # hopefully only 1 or 0 values in idx
        <assign value> df1.at[i, 'A'] = ???

我想拥有列表的原因是'C'值的数量很灵活,后来我想计算平均值,标准差...

编辑:错字

2 个答案:

答案 0 :(得分:1)

对于高于0.24.x版本的熊猫,您可以使用:

import numpy as np
import pandas as pd

df3 = (df1.merge(
            df2.groupby('A')['C'].apply(np.array),
            how='left',
            left_on='A',
            right_index=True))

有关您的摘要统计信息:

df3['C'].apply(lambda x: np.std(x))
df3['C'].apply(lambda x: np.mean(x))

答案 1 :(得分:0)

这是merging的完美示例,其后groupby通过应用list函数,如下所示:

# Merge on key columns A
df3 = pd.merge(df1, df2, on='A', how='outer')

# Output1
    A   B   C
0   ida 1   10.0
1   idb 2   20.0
2   idb 2   21.0
3   idb 2   22.0
4   idc 3   NaN

# Groupby and apply list to keep values
df_final = df3.groupby('A').C.apply(list).reset_index()


    A   C
0   ida [10.0]
1   idb [20.0, 21.0, 22.0]
2   idc [nan]

编辑:

如果您只希望合并后带上某些列,则可以执行以下操作:
df3 = pd.merge(df1, df2[['A', 'C']], on='A', how='outer')