我是Python和Pandas的新手。你能给我建议如何使用DataFrame进行下一次操作吗?我有DataFrame_1
:
id id_name revenue
0 a name_a 65
1 a name_b 65
2 a name_a 70
3 a name_b 70
4 a name_a 121
5 a name_b 121
我希望下一个DataFrame_2
:
id id_name revenue
0 a name_a, name_b 65
1 a name_a, name_b 70
2 a name_a, name_b 121
然后制作下一个DataFrame_3
id id_name1 id_name2 revenue
0 a name_a name_b 65
1 a name_a name_b 70
2 a name_a name_b 121
因此,我希望第一步将字符串与相同的'revenue'
组合,然后在第二步中拆分列'id_name'
。
答案 0 :(得分:2)
使用groupby
和cumcount
创建附加密钥,然后我们unstack
s=df.groupby(['id','id_name']).cumcount()
df['NewId']=s.groupby(s).cumcount()+1
df.set_index(['id','revenue','NewId'])['id_name'].unstack().add_prefix('id_name').reset_index()
Out[137]:
NewId id revenue id_name1 id_name2
0 a 65 name_a name_b
1 a 70 name_a name_b
2 a 121 name_a name_b
答案 1 :(得分:2)
这是一个解决方案。第一部分与@ALollz相同,但第二部分在计算每组的最大id_names数后使用列表理解。
# groupby to list of id_names
df2 = df.groupby(['id', 'revenue'])['id_name'].apply(list).reset_index()
# copy df2
df3 = df2.copy()
# calculate max number of id_names
lens = max(map(len, df3['id_name'].values))
# split columns
df3[['id_name'+str(i) for i in range(1, lens+1)]] = df2['id_name'].apply(pd.Series)
# drop unsplit column
df3 = df3.drop('id_name', 1)
print(df3)
id revenue id_name1 id_name2 id_name3
0 a 65 name_a name_b NaN
1 a 70 name_a name_b NaN
2 a 121 name_a name_b name_c
答案 2 :(得分:1)
您基本上可以使用DataFrame
groupby
df2 = df1.groupby(['id', 'revenue']).id_name.apply(list).reset_index()
id revenue id_name
0 a 65 [name_a, name_b]
1 a 70 [name_a, name_b]
2 a 121 [name_a, name_b]
对于第三个DataFrame
,您只需将pandas.Series
应用于您在上面创建的列表即可。这是一个解决方案,您不需要知道最后会有多少列。它将正确地重命名为10。
import pandas as pd
import numpy as np
df3 = pd.concat([df2[['id', 'revenue']], df2['id_name'].apply(pd.Series)], axis=1)
df3.rename(columns=dict((item, 'id_name'+str(item+1)) for item in np.arange(0,10,1)), inplace=True)
id revenue id_name1 id_name2
0 a 65 name_a name_b
1 a 70 name_a name_b
2 a 121 name_a name_b