根据匹配列值压缩数据帧

时间:2018-08-02 16:34:04

标签: python python-3.x pandas dataframe

我正在做一个大型项目,我需要组合多个数据框来执行其余的分析。问题是所有其他数据帧,但其中一个具有唯一的唯一标识符,设置为ZZZ-999。问题数据帧可以但不总是具有两个值设置为ZZZ-999 ABCD或ZZZ-999 EFGH。字段示例

主数据框(要添加列)

 Unit ID     |     Region        |  Unit Value
 ZZZ-997           East                 100
 ZZZ-998           West                 200
 ZZZ-999           South                300

DataFrame需要与主DataFrame结合

 Unit ID    |   Product Type   |  Individual Value  |  Final Disposition
 ZZZ-997         ZZZ-997 ABCD        50                    Returned
 ZZZ-997         ZZZ-997 EFGH        50                    Returned
 ZZZ-998         ZZZ-998 ABCD        200                   Order Closed
 ZZZ-999         ZZZ-999 ABCD        100                   Order Closed
 ZZZ-999         ZZZ-999 EFGH        200                   Returned

我想要的结果是:

 Unit ID     |     Region        |  Unit Value |  Individual Value ABCD  |  Final Disposition ABCD  |  Individual Value EFGH |  Final Disposition EFGH
 ZZZ-999           South             300               100                       Returned                        200                 Order Closed

我尝试执行此操作涉及pd.dataframe.iterrows()在两个数据帧之间创建循环,并使用dataframe.loc()组合以永久添加到仓库中。问题是每行数据要花几秒钟,而我有超过10万行数据。结合以上数据集的最有效方法是什么。

感谢您的时间,

最好

安迪

1 个答案:

答案 0 :(得分:3)

您可以

df['Product Type']=df['Product Type'].str.split().str[1]
newdf=df.set_index(['Unit ID','Product Type']).unstack().sort_index(level=1,axis=1)
newdf.columns=newdf.columns.map(' '.join)
newdf=newdf.reset_index()
newdf
Out[814]: 
   Unit ID  Individual Value ABCD Final Disposition ABCD  \
0  ZZZ-997                   50.0               Returned   
1  ZZZ-998                  200.0           Order Closed   
2  ZZZ-999                  100.0           Order Closed   
   Individual Value EFGH Final Disposition EFGH  
0                   50.0               Returned  
1                    NaN                   None  
2                  200.0               Returned  

获取newdf后,只需像newdf.merge(main)那样合并即可产生结果