代码之家  ›  专栏  ›  技术社区  ›  ac24

将具有公用键的行转换为具有多列的单行

  •  1
  • ac24  · 技术社区  · 6 年前

    我有两个数据帧要合并成一个。这个 main_id 框架包含唯一ID的列表。这个 ref_data 框架包含有关中对象的一些数据 main\u id 。有些ID被引用了两次,有些只被引用了一次,所以我想我需要一对多的连接。我想捕获 period 值及其对应 quantity ,带有一些识别后缀,将两者联系起来。我已经查看了关于merge的pandas文档,但没有真正看到提到这个用例的内容。感谢您的帮助。

    实例

    main\u id框架:

    main_id = pd.DataFrame(data = [123,456,789], columns=['id'])
    
    main_id
    
    Out[109]: 
        id
    0  123
    1  456
    2  789
    

    ref\u数据框:

    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 回复  |  直到 6 年前
        1
  •  1
  •   DJK    6 年前

    这应该对你有用 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
    
        2
  •  1
  •   Allen Qin    6 年前

    使用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