pandas中实现将相同ID的字符串进行合并
作者:Just_do_it_2018
这篇文章主要介绍了pandas中实现将相同ID的字符串进行合并问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
问题描述
""" id value 1 A 1 B 1 C 2 D 2 E 2 F 变为: id value 1 [A,B,C] 2 [D,E,F] pandas怎么把上面的结构变为下面的形式? """
自己的解决方案
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进行分类 # 转变成array对象之后,可以根据data1[0][1]查看其结构 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) #再创建新的dataframe new_data = pd.DataFrame({'id':[1,2],'value':all_value}) print(new_data)
输出结果为:
id value
0 1 [A, B, C]
1 2 [D, E, F]
大神的更优化的解法
解法一:
可以用sum方法,将字符串进行连接
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()
此时的输出结果为:
id
1 ABC
2 DEF
Name: value, dtype: object
但是还不是我们想要的,因为我们还需要在中间加入逗号分隔
① 我们可以先将原始数据的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)
② 然后,对其使用sum方法进行字符串相加
data1 = data.groupby(by='id').sum()
此时的输出结果为,value值之前多了“,”
id value
1 ,A,B,C
2 ,D,E,F
③ 最后,对该列使用apply函数,去除‘,’
data1['value'] = data1['value'].apply(lambda x :[x[1:]])
就得到了最终的结果:
id value
1 [A,B,C]
2 [D,E,F]
解法二:
对分组之后的结果,直接使用apply函数
一行代码就搞定!
data1 = data.groupby(by='id').apply(lambda x:[','.join(x['value'])])
那为什么可以这么做呢?
首先需要剖析的是,groupby之后的数据结构是什么样的,它是由元组构成的(分组名,数据块),数据块也就是dataframe结构。使用以下方式可以查看groupby之后的对象:
for ID,group in group_df: print(ID) print(group)
apply函数中的x作用的即是数据块(dataframe),通过数据块取value那一行得到的是Series对象,于是可以使用join方法进行操作。
总结
sum方法不仅可以用于数值计算,还可用于对于一个Series对象而言的字符串相加
a = ['a','b'] c = pd.Series(a).sum()
apply函数非常灵活,不仅可以作用于一个Series对象,还可以作用于一个groupby之后的数据块
data['value'].apply(lambda x :*****) data.groupby(by='**').apply(lambda x :*****)
lambda匿名函数可以极大优化精简我们的代码,是一个非常灵活好用的函数,记住它!
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。