我有两个数据帧合并为一个。 main_id
框架包含唯一ID列表。 ref_data
框架包含有关main_id
中对象的一些数据。有些id被引用两次,有些只引用一次,所以我认为我需要一对多的连接。我想捕获period
值及其对应的quantity
,并使用一些标识后缀来连接两者。我已经回顾了关于合并的pandas文档,但没有真正看到提及此用例的内容。任何帮助都感激不尽。
示例
main_id框架:
main_id = pd.DataFrame(data = [123,456,789], columns=['id'])
main_id
Out[109]:
id
0 123
1 456
2 789
ref_data frame:
ref_data = pd.DataFrame()
ref_data['main_id'] = main_id['id'].append(main_id['id'].loc[1:])
ref_data = ref_data.reset_index(drop=True)
ref_data['period'] = ['24hr', 'Day', 'Day', 'Night', 'Night']
ref_data['quantity'] = [3,4,6,5,2]
ref_data
Out[111]:
main_id period quantity
0 123 24hr 3
1 456 Day 4
2 789 Day 6
3 456 Night 5
4 789 Night 2
期望的输出:
Out[112]:
id period_1_ref period_1_val period_2_ref period_2_val
0 123 24hr 3 NaN NaN
1 456 Day 4 Night 5.0
2 789 Day 6 Night 2.0
答案 0 :(得分:1)
这应该对你有用,只需使用groupby
无需合并
mrg = ref_data.groupby('main_id').apply(lambda x: x[['period','quantity']].values.ravel())
pd.DataFrame(mrg.tolist(),index=mrg.index,columns=['period_1_ref','period_1_val','period_2_ref','period_2_val'])
period_1_ref period_1_val period_2_ref period_2_val
main_id
123 24hr 3 None NaN
456 Day 4 Night 5.0
789 Day 6 Night 2.0
答案 1 :(得分:1)
使用groupby的类似方法:
(
ref_data.set_index('main_id').groupby(level=0)
.apply(lambda x: x.values.reshape(1,-1)[0])
.apply(pd.Series)
.set_axis(['period_1_ref','period_1_val','period_2_ref', 'period_2_val'],
axis=1, inplace=False)
)
Out[117]:
period_1_ref period_1_val period_2_ref period_2_val
main_id
123 24hr 3 NaN NaN
456 Day 4 Night 5.0
789 Day 6 Night 2.0