将行数据合并为单个列的列表类型

时间:2018-11-30 13:50:10

标签: python pandas dataframe pandas-groupby

我的数据框看起来像-

WIT_ID      ML_ENTITY_TYPE  ML_ENTITY_NAME   EDT_ENTITY_NAME    USER_ACTION IS_MAIN 
17668620    RBNAME          MANGO            NaN                3           0   
17668620    RBNAME          BANANA           NaN                3           0   
17668620    DRWECNTRY       SINGAPORE        NaN                3           0   
17668620    TRNSPVESSEL     DUMMY            NaN                3           0   

我想将列表类型的ML_ENTITY_NAME组合为相同的WIT_ID和相同的ML_ENTITY_TYPEEDT_ENTITY_NAME USER_ACTION IS_MAIN在整个数据帧中都将保持相同。

WIT_ID      ML_ENTITY_TYPE  ML_ENTITY_NAME   EDT_ENTITY_NAME    USER_ACTION IS_MAIN 
17668620    RBNAME          [MANGO,BANANA]   NaN                3           0   
17668620    DRWECNTRY       SINGAPORE        NaN                3           0   
17668620    TRNSPVESSEL     DUMMY            NaN                3           0

目前,我的方法类似于this

但是我无法为我的数据框正确应用该解决方案。

如果有人对这个查询有任何建议,答案或需要更多信息,请发表评论/答案。

2 个答案:

答案 0 :(得分:1)

我发现this链接可能会有所帮助。基本上,您可能要寻找的线是

df.join(df.groupby(['WIT_ID','ML_ENTITY_TYPE'])['ML_ENTITY_NAME'].apply(list).to_frame('new_column'),on = ['WIT_ID','ML_ENTITY_TYPE'])

这将添加一个新列,其合并值为“ ML_ENTITY_TYPE”。

答案 1 :(得分:0)

如果按具有NaN的列分组,则所有组都将排除在外,这将是一个问题。解决方案是将NaN替换为temporay值,应用解决方案并替换回去:

如果按不包含ML_ENTITY_NAME的所有列进行分组的解决方案:

df1 = (df.fillna('MISS')
       .groupby(df.columns.difference(['ML_ENTITY_NAME']).tolist())['ML_ENTITY_NAME']
       .agg(list)
       .reset_index()
       .reindex(columns=df.columns)
       .replace('MISS', np.nan))
print (df1)

     WIT_ID ML_ENTITY_TYPE   ML_ENTITY_NAME  EDT_ENTITY_NAME  USER_ACTION  \
0  17668620      DRWECNTRY      [SINGAPORE]              NaN            3   
1  17668620         RBNAME  [MANGO, BANANA]              NaN            3   
2  17668620    TRNSPVESSEL          [DUMMY]              NaN            3   

   IS_MAIN  
0        0  
1        0  
2        0