我想知道将信息从几个数据帧聚合到一个新数据中的最经济方法是基于匹配ID。
每个df都有一个“ participant_id”列,每一行都有不同的参与者ID。我想最后得到一个具有一个participed_id列的df,并从其他列的每个其他df获得一个分数。
因此,我必须需要一个变量来保存参与者ID,遍历每一行并提升必要的列。然后,所有相应的分数都需要放在与正确的参与者ID关联的适当行上。
我不确定这是否是解决问题的最佳方法?在什么时候匹配参与者ID才有意义?早还是晚?
输入数据和预期输出:
### three datasets
d1 = {'part_id': ['PartID_1234', 'PartID_5678'], 'col2': [1, 2]}
df1 = pd.DataFrame(data=d1)
d2 = {'part_id': ['PartID_1234', 'PartID_5678'], 'col2': [3, 4]}
df2 = pd.DataFrame(data=d2)
d3 = {'part_id': ['PartID_5678', 'PartID_1234'], 'col2': [5, 6]}
df3 = pd.DataFrame(data=d3)
### aggregated dataset based on ID
import numpy as np
result = pd.DataFrame(np.array([['PartID_1234', 1, 3, 6], ['PartID_5678', 2, 4, 5]]))
答案 0 :(得分:1)
您可以将merge
与how='outer'
一起使用,以达到预期的外部联接效果:
df1.merge(df2, on='part_id', how='outer').merge(df3, on='part_id', how='outer')
part_id col2_x col2_y col2
0 PartID_1234 1 3 6
1 PartID_5678 2 4 5
答案 1 :(得分:0)
我相信您需要concat
和set_index
,每个DataFrame
都需要列表理解中的列part_id
的索引:
dfs = [df1, df2, df3]
dfs = [x.set_index('part_id')['col2'] for x in dfs]
df = pd.concat(dfs, axis=1).reset_index()
df.columns = range(len(df.columns))
print (df)
0 1 2 3
0 PartID_1234 1 3 6
1 PartID_5678 2 4 5
如果要索引中的第一列:
dfs = [df1, df2, df3]
dfs = [x.set_index('part_id')['col2'] for x in dfs]
df = pd.concat(dfs, axis=1, ignore_index=True)
print (df)
0 1 2
PartID_1234 1 3 6
PartID_5678 2 4 5