查找3个数据集并在pandas中为结果创建新列

mzaanser  于 2023-10-14  发布在  其他
关注(0)|答案(2)|浏览(114)
data_1 = {'ID': ['234', '456', '331', '134','372','456','765'], 
    'Result': ['A','A','A','A','A','A','A']}

我有第一个数据集,然后是第二个数据集

data_2 = {'ID': ['456', '132', '098', '134','372','456','234'], 
    'Result': ['B','B','B','B','B','B','B']}

第三个数据集

data_3 = {'ID': ['111', '132', '765', '134','234','999','765'], 
    'Result': ['C','C','C','C','C','C','C']}

我想要的结果是

new_df = {'ID': ['234', '111', '456', '331','132','999','765'], 
    'Result': ['ABC','C','AB','A','BC','C','AC']}

我尝试使用左连接和3数据集,但仍然无法创建一个新的列或新的数据框。在Excel中,我可以尝试从第一个数据集查找到第二个数据集,在我得到之后,我再次查找到数据集3,并再次从第一个数据集查找到第三个数据集。有没有什么办法,如果我在Pandas数据框架?

g52tjvyc

g52tjvyc1#

可以使用concatgroupby.agg

dfs = [data_1, data_2, data_3]
out = (pd.concat([d.set_index('ID') for d in dfs])
         .groupby('ID').agg(lambda x: ''.join(dict.fromkeys(x)))
         .reset_index()
       )

输出量:

ID Result
0  098      B
1  111      C
2  132     BC
3  134    ABC
4  234    ABC
5  331      A
6  372     AB
7  456     AB
8  765     AC
9  999      C

如果你真的想要一个leftjoin,那么reindex

dfs = [data_1, data_2, data_3]
out = (pd.concat([d.set_index('ID') for d in dfs])
         .groupby('ID').agg(lambda x: ''.join(dict.fromkeys(x)))
         .reindex(data_1['ID']).reset_index()
       )

输出量:

ID Result
0  234    ABC
1  456     AB
2  331      A
3  134    ABC
4  372     AB
5  456     AB
6  765     AC
elcex8rz

elcex8rz2#

另一种可能的解决方案,基于pandas.merge

out = (df1.merge(df2, on = 'ID', how='outer')
       .merge(df3, on = 'ID', how='outer')
       .drop_duplicates().fillna(''))
out.assign(result = out.iloc[:,1:].sum(axis=1)).iloc[:, [0,-1]]

如果我们有很多嵌套(或者想要压缩代码),我们可以使用functools.reduce

from functools import reduce

out = reduce(lambda x, y: x.merge(y, on='ID', how='outer'), [df2, df3], df1)
out = out.drop_duplicates().fillna('')
out.assign(result = out.iloc[:,1:].sum(axis=1)).iloc[:, [0,-1]]

输出量:

ID result
0   234    ABC
1   456     AB
5   331      A
6   134    ABC
7   372     AB
8   765     AC
10  132     BC
11  098      B
12  111      C
13  999      C

相关问题