Используя Pandas groupby, как вы можете объединить столбец списков, используя сложение? - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть фрейм данных со столбцом, который содержит список значений. Каждая строка в кадре данных имеет список одинаковой длины. Я хотел бы использовать Dataframe.groupby для группировки данных в кадре данных и суммировать списки следующим образом:

В:

import pandas as pd

#Sample data
a = pd.DataFrame([['a', 'test', list([0,1,2,3,4])],['b', 'test', list([5,6,7,8,9])]], columns=['id', 'grp', 'values'])
print(a)

#Some function to group the dataframe
#b = a.groupby('grp').someAggregationFunction()

#Example of desired output
b = pd.DataFrame([['test', list([5,7,9,11,13])]], columns=['grp', 'values'])
    print(b)

Из:

  id   grp           values
0  a  test  [0, 1, 2, 3, 4]
1  b  test  [5, 6, 7, 8, 9]

    grp             values
0  test  [5, 7, 9, 11, 13]

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

Вам может не понравиться этот ответ, но лучше не использовать списки в кадрах данных. Вы должны стремиться, где это возможно, использовать числовой ряд для числовых данных:

res = df.join(pd.DataFrame(df.pop('values').tolist()))\
        .groupby('grp').sum().reset_index()

print(res)

    grp  0  1  2   3   4
0  test  5  7  9  11  13
0 голосов
/ 05 сентября 2018

Использование numpy.stack:

pd.DataFrame(
    [(i, np.stack(g).sum(0)) for i, g in a.groupby('grp')['values']],
    columns=['grp', 'values']
)

    grp             values
0  test  [5, 7, 9, 11, 13]

Также используя apply, но apply будет медленным:

a.groupby('grp')['values'].apply(lambda x: np.stack(x).sum(0)).to_frame('values')

                 values
grp
test  [5, 7, 9, 11, 13]
0 голосов
/ 05 сентября 2018

Вставьте его в одну строку

a.groupby('grp')['values'].apply(lambda x : pd.DataFrame(x.values.tolist()).sum().tolist())
Out[286]: 
grp
test    [5, 7, 9, 11, 13]
Name: values, dtype: object

Также я рекомендую не использовать apply здесь

b=pd.DataFrame(a['values'].values.tolist()).groupby(a['grp']).sum()
pd.DataFrame({'grp':b.index,'values':b.values.tolist()})
Out[293]: 
    grp             values
0  test  [5, 7, 9, 11, 13]
0 голосов
/ 05 сентября 2018

Одним из решений является transform ваше lists в np.arrays и использование простой суммы

a['v'] = a.v.transform(np.array)
a.groupby('grp').v.apply(lambda x: x.sum())

    grp     v
0   test    [5, 7, 9, 11, 13]

Обратите внимание, что я изменил values на v, чтобы не ошибиться с аксессором .values с pd.DataFrame

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...