使用公共密钥将行转换为具有多列的单行

时间:2018-03-07 19:21:25

标签: python pandas

我有两个数据帧合并为一个。 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

2 个答案:

答案 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