如何获得这个版本的熊猫假人

时间:2020-01-22 12:23:03

标签: python pandas

我有一张这样的桌子:

person_id        item_id          time             value_1        cat_1
    1             34545    2009-11-15 18:08:00       6.5           cm   
    1             34546    2009-11-15 18:08:00       5.2           met  
    1             49996    2009-11-15 18:08:00       4.5           abc  
    2             34545    2008-12-19 09:55:00       nan           xyz  
    2             34546    2008-12-19 09:55:00       8.9           abc  
    3             49996    2009-06-15 14:04:00       3.4           cm   
    3             34545    2009-06-15 14:04:00       3.6           met  
    3             34546    2009-04-23 23:05:00       99.1          xyz  

每个人在特定时间都有一些item被执行。因此,我想获取item_id假人,而不是其中的0和1值。我想拥有value_1cat_1的价值。

仅在person_idtime相同的情况下执行假人

在上面的示例中,我具有以下唯一的item_id

  1. 34545
  2. 34546
  3. 49996

所以我想创建以下列:

34545_value_134545_cat_134546_value_134546_cat_149996_value_149996_cat_1

预期输出:

person_id        item_id          time             34545_value_1     34545_cat_1      34546_value_1    34546_cat_1      49996_value_1      49996_cat_1` 

    1             34545    2009-11-15 18:08:00         6.5               cm               5.2               met               4.5               abc         
    2             34545    2008-12-19 09:55:00         nan               xyz              8.9               abc               nan               nan
    3             49996    2009-06-15 14:04:00         3.6               met              nan               nan               3.4               cm          
    3             34546    2009-04-23 23:05:00         nan               nan              99.1              xyz               nan               nan

编辑:仅在person_id和时间相同的情况下执行虚拟操作

1 个答案:

答案 0 :(得分:1)

使用:

new_df = ( df.pivot_table(index = ['person_id','time'],
                          columns = ['item_id'],
                          values = ['value_1','cat_1','item_id'],aggfunc = 'first')

         )
new_df.columns = [f'{y}_{x}' for x,y in new_df.columns]
new_df = (df.groupby(['person_id','time'])
            .item_id.first()
            .to_frame()
            .join(new_df)
            .reset_index())
print(new_df)
   person_id                time  item_id 34545_cat_1 34546_cat_1 49996_cat_1  \
0          1 2009-11-15 18:08:00    34545          cm         met         abc   
1          2 2008-12-19 09:55:00    34545         xyz         abc         NaN   
2          3 2009-04-23 23:05:00    34546         NaN         xyz         NaN   
3          3 2009-06-15 14:04:00    49996         met         NaN          cm   

   34545_value_1  34546_value_1  49996_value_1  
0            6.5            5.2            4.5  
1            NaN            8.9            NaN  
2            NaN           99.1            NaN  
3            3.6            NaN            3.4