如何将数据框中的字符串组合到列表和拆分列?

时间:2018-05-13 21:50:34

标签: python python-3.x pandas dataframe

我是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'

3 个答案:

答案 0 :(得分:2)

使用groupbycumcount创建附加密钥,然后我们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