根据第一列中的字符串跨数据框架汇总数据

时间:2018-11-01 12:41:18

标签: python pandas dataframe

我想知道将信息从几个数据帧聚合到一个新数据中的最经济方法是基于匹配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]]))

2 个答案:

答案 0 :(得分:1)

您可以将mergehow='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)

我相信您需要concatset_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