pandas中實(shí)現(xiàn)將相同ID的字符串進(jìn)行合并
問題描述
""" id value 1 A 1 B 1 C 2 D 2 E 2 F 變?yōu)椋? id value 1 [A,B,C] 2 [D,E,F] pandas怎么把上面的結(jié)構(gòu)變?yōu)橄旅娴男问剑? """
自己的解決方案
import pandas as pd import numpy as np data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']}) data1 = np.array(data.groupby(['id']))#按照id進(jìn)行分類 # 轉(zhuǎn)變成array對(duì)象之后,可以根據(jù)data1[0][1]查看其結(jié)構(gòu) id_kinds = 2#id的種類,此例比如1、2共兩種 all_value = [] for j in range(2): value = [] for i in data1[j][1]['value']: value.append(i) all_value.append(value) print(all_value) #再創(chuàng)建新的dataframe new_data = pd.DataFrame({'id':[1,2],'value':all_value}) print(new_data)
輸出結(jié)果為:
id value
0 1 [A, B, C]
1 2 [D, E, F]
大神的更優(yōu)化的解法
解法一:
可以用sum方法,將字符串進(jìn)行連接
import pandas as pd import numpy as np data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']}) data1 = data.groupby(by='id')['value'].sum()
此時(shí)的輸出結(jié)果為:
id
1 ABC
2 DEF
Name: value, dtype: object
但是還不是我們想要的,因?yàn)槲覀冞€需要在中間加入逗號(hào)分隔
① 我們可以先將原始數(shù)據(jù)的value都變成“,A”
data = pd.DataFrame({'id':[1,1,1,2,2,2],'value':['A','B','C','D','E','F']}) data['value'] = data['value'].apply(lambda x:','+ x)
② 然后,對(duì)其使用sum方法進(jìn)行字符串相加
data1 = data.groupby(by='id').sum()
此時(shí)的輸出結(jié)果為,value值之前多了“,”
id value
1 ,A,B,C
2 ,D,E,F
③ 最后,對(duì)該列使用apply函數(shù),去除‘,’
data1['value'] = data1['value'].apply(lambda x :[x[1:]])
就得到了最終的結(jié)果:
id value
1 [A,B,C]
2 [D,E,F]
解法二:
對(duì)分組之后的結(jié)果,直接使用apply函數(shù)
一行代碼就搞定!
data1 = data.groupby(by='id').apply(lambda x:[','.join(x['value'])])
那為什么可以這么做呢?
首先需要剖析的是,groupby之后的數(shù)據(jù)結(jié)構(gòu)是什么樣的,它是由元組構(gòu)成的(分組名,數(shù)據(jù)塊),數(shù)據(jù)塊也就是dataframe結(jié)構(gòu)。使用以下方式可以查看groupby之后的對(duì)象:
for ID,group in group_df: ? ? print(ID) ? ? print(group)
apply函數(shù)中的x作用的即是數(shù)據(jù)塊(dataframe),通過數(shù)據(jù)塊取value那一行得到的是Series對(duì)象,于是可以使用join方法進(jìn)行操作。
總結(jié)
sum方法不僅可以用于數(shù)值計(jì)算,還可用于對(duì)于一個(gè)Series對(duì)象而言的字符串相加
a = ['a','b'] c = pd.Series(a).sum()
apply函數(shù)非常靈活,不僅可以作用于一個(gè)Series對(duì)象,還可以作用于一個(gè)groupby之后的數(shù)據(jù)塊
data['value'].apply(lambda x :*****) data.groupby(by='**').apply(lambda x :*****)
lambda匿名函數(shù)可以極大優(yōu)化精簡我們的代碼,是一個(gè)非常靈活好用的函數(shù),記住它!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python之eval()函數(shù)危險(xiǎn)性淺析
這篇文章主要介紹了Python之eval()函數(shù)危險(xiǎn)性淺析,需要的朋友可以參考下2014-07-07python3 中的字符串(單引號(hào)、雙引號(hào)、三引號(hào))以及字符串與數(shù)字的運(yùn)算
這篇文章主要介紹了python3 中的字符串(單引號(hào)、雙引號(hào)、三引號(hào))以及字符串與數(shù)字的運(yùn)算,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07django admin 后臺(tái)實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼
這篇文章主要介紹了django admin 后臺(tái)實(shí)現(xiàn)三級(jí)聯(lián)動(dòng)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06將.ipynb文件轉(zhuǎn)換成.py文件詳細(xì)步驟(一看就會(huì))
這篇文章主要給大家介紹了關(guān)于如何將.ipynb文件轉(zhuǎn)換成.py文件的詳細(xì)步驟,文中通過圖文介紹的非常詳細(xì),大家基本一看就會(huì),需要的朋友可以參考下2023-07-07用Python的Django框架完成視頻處理任務(wù)的教程
這篇文章主要介紹了用Python的Django框架完成視頻處理任務(wù)的教程,包括用戶的視頻上傳和播放以及下載功能的實(shí)現(xiàn),需要的朋友可以參考下2015-04-04Python使用Beautiful Soup爬取豆瓣音樂排行榜過程解析
這篇文章主要介紹了Python使用Beautiful Soup爬取網(wǎng)頁過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08