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:]])