Как объединить строки в датафрейме в список и разбить столбец? - PullRequest
0 голосов

Я новичок в 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 голосов
/ 14 мая 2018

С помощью 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
0 голосов
/ 14 мая 2018

Это одно решение. Первая часть идентична @ALollz, но вторая использует понимание списка после вычисления максимального числа идентификаторов в группе.

# 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
0 голосов
/ 14 мая 2018

Вы можете достичь второго 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...