pandas之多行按類合併爲一行

前言

前面講到explode操作是把某一列中的嵌套列表拆分爲多行
那有時候我們會有着相反的需求,即按照某一列,把相同值對應的多行合併成一行

原理

主要用到groupby函數+apply函數

  1. 讀取數據
data=pd.read_csv('data.csv',header=None)
data.columns=['car_id','time','lon','lat']

數據展示
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)

結果展示
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))

結果展示
完整代碼

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 合併成一行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章