DataFream里多列相同时对不同列进行操作groupby与agg

参考[python:怎样合并文档中有重复部分的行?]

最近数据预处理中遇到dataFream里有多列相同但有一列或多列不同,为了使得相同的列能确定一行,想要根据相同列合并不同列,最后发现先使用goupby分组,再使用agg函数和lambda可以解决这个问题,所以记录以下。下面是具体的问题:

vt_count=data.groupby(['vid','table_id'],as_index=False).count()

vt_count[vt_count['field_results']>1].head()
'''
    vid table_id  field_results
1    000330ad1f424114719b7525f400660b     0102              3
147  000381f0069cbf7537e6aac8923034ae     0102              3
250  0003848ebd8d8163603760d53d975693     0101              3
251  0003848ebd8d8163603760d53d975693     0102              6
331  0003848ebd8d8163603760d53d975693     1308              2
'''
data[np.logical_and(data['vid']=='000330ad1f424114719b7525f400660b',data['table_id']=='0102')]
'''
    vid table_id             field_results
1439773  000330ad1f424114719b7525f400660b     0102     甲状腺彩超(含颈部淋巴细胞)未发现明显异常
1439811  000330ad1f424114719b7525f400660b     0102  前列腺:前列腺稍大膀胱、双侧输尿管未发现明显异常
1439816  000330ad1f424114719b7525f400660b     0102      肝、胆、胰、脾、左肾、右肾未发现明显异常
'''
##这样的话,可以看出同一个vid,同一个table_id并不能确定一行

所以想要根据vid和table_id相同的行合并其field_results,经过一番折腾找到了参考文献中给出的解决方案,即使用groupy和agg,具体操作如下:

data=pd.concat([data1,data2])
data.to_csv("data.csv",index=False)
data=pd.read_csv("data.csv",header=None)
'''
data.head()
                                  0         1              2
0                              vid  table_id  field_results
1  002d1e4859fafd9ded2a2e1e7c839b62      2403           72.9
2  002d1e4859fafd9ded2a2e1e7c839b62      2404          166.5
3  002d1e4859fafd9ded2a2e1e7c839b62      2405          26.30
4  002d1e4859fafd9ded2a2e1e7c839b62      2420             79
'''
data=data.astype(str)
grouped = data.groupby([0,1])
result = grouped.agg(lambda x:'|'.join(x))

结果:

result.to_csv('result1.csv')
result=pd.read_csv('result1.csv')

result.columns=['vid','table_id','field_results']
'''
result.head()
                                vid table_id  \
0  000330ad1f424114719b7525f400660b     0101   
1  000330ad1f424114719b7525f400660b     0102   
2  000330ad1f424114719b7525f400660b     0113   
3  000330ad1f424114719b7525f400660b     0114   
4  000330ad1f424114719b7525f400660b     0115   

                                       field_results  
0  双侧甲状腺大小形态正常,包膜光整,实质回声均匀,光点稍粗,未见明显异常回声。CDFI:血流显...  
1  甲状腺彩超(含颈部淋巴细胞)未发现明显异常|前列腺:前列腺稍大膀胱、双侧输尿管未发现明显异常...  
2                     肝脏大小、形态正常,包膜光整,肝内血管走行较清晰,回声均匀。  
3                      胆囊大小、形态正常,囊壁光整,囊腔内透声好,胆总管无扩张。  
4                      胰腺大小、形态正常,边缘规整,内部回声均匀,胰管未见扩张。 

这样只需要简短几行就可以将field_results根据相同列拼接起来,这里只做简单的记录,具体agg函数和lambda表达式用法可以参考具体介绍这两者用法的文章。

你可能感兴趣的:(数据预处理)