我有两个数据框:
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'])
,我想将df2
到df1
的数据附加到列表中:
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'值的数量很灵活,后来我想计算平均值,标准差...
编辑:错字
答案 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')