pandas之多行按类合并为一行

前言

前面讲到explode操作是把某一列中的嵌套列表拆分为多行
那有时候我们会有着相反的需求,即按照某一列,把相同值对应的多行合并成一行

原理

主要用到groupby函数+apply函数

  1. 读取数据
data=pd.read_csv('data.csv',header=None)
data.columns=['car_id','time','lon','lat']

《pandas之多行按类合并为一行》
2. 多列合并为一列

def merge_cols(Series):
    # 获取非空项
    Series=Series[Series.notna()]
    # 获取当行所有数据
    value=Series.value
    # 将每一行的数据变为一个一层嵌套的列表
    result=[value[0],value[1],value[2]]
    return result
data['tra_info']=data.iloc[:,1:].apply(merge_cols,axis=1)

也可以使用匿名函数写

data['tra_info']=data.iloc[:,1:].apply(lambda x: [x.values[0],x.values[1],x.values[2]],axis=1)

《pandas之多行按类合并为一行》
3. 多行合并为一行

new_data=data.groupby(['car_id'],as_index=False)["tra_info"].apply(list)

也可以使用匿名函数写

new_data=data.groupby(['car_id'],as_index=False)["tra_info"].apply(lambda x :list(x))

《pandas之多行按类合并为一行》
完整代码

import pandas as pd
def merge_cols(Series):
    # 获取非空项
    Series=Series[Series.notna()]
    # 获取当行所有数据
    value=Series.values
    # 将每一行的数据变为一个一层嵌套的列表
    result=[value[0],value[1],value[2]]
    return result
data=pd.read_csv('data.csv',header=None)
data.columns=['car_id','time','lon','lat']
print(data)
# data['tra_info']=data.iloc[:,1:].apply(merge_cols,axis=1)
data['tra_info']=data.iloc[:,1:].apply(lambda x: [x.values[0],x.values[1],x.values[2]],axis=1)
data=data.drop(['time','lon','lat'],axis=1)
print(data)
# new_data=data.groupby(['car_id'],as_index=False)["tra_info"].apply(list)
new_data=data.groupby(['car_id'],as_index=False)["tra_info"].apply(lambda x :list(x))
print(new_data)
new_data.to_csv('tra_data.csv',index=False)

参考链接:
如何根据多列的值将多行与python pandas 合并成一行

    原文作者:fff2zrx
    原文地址: https://blog.csdn.net/qq_38412868/article/details/105332811
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞