Сгруппируйте по определенному столбцу и примените функцию в Python - PullRequest
1 голос
/ 04 июля 2019

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

A       B       C
1       4       3
1       5       4
1       2       10
2       7       2
2       4       4
2       6       6

Я определил простую функцию для получения длины столбца «B» и суммы столбца «C» с последующим суммированием длины и суммы для каждой группы в столбце «A» для создания столбца «D». Поэтому я ожидаю получить следующий вывод:

A       D
1       20
2       15

Я запустил код ниже и не могу получить то, что хочу:

>>> import pandas as pd
>>> 
>>> df = pd.read_csv("foo.txt", sep="\t")
>>> df
   A  B   C
0  1  4   3
1  1  5   4
2  1  2  10
3  2  7   2
4  2  4   4
5  2  6   6
>>> 
>>> def someFunction(x, y):
...         length = len(x)
...         total = sum(y)
...         number = length + total
...         print(number)
... 
>>> f = lambda x: someFunction(x['B'], x['C'])
>>> output = df.groupby(['A']).apply(f)
20
20
15
>>> output
Empty DataFrame
Columns: []
Index: []
>>> 

Как получить желаемый результат? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Это должна работа:

import pandas as pd 

df= pd.DataFrame()

df['A']= [1,1,1,2,2,2]
df['B']= [4,3,2,7,4,6]
df['C']= [3,4,10,2,4,6]

def someFunction(data):

    return len(data['B'])+ sum(data['C'])

# apply to groupby 
df.groupby('A').apply(someFunction)

Output[1]:

A
1    20
2    15
dtype: int64

Не забудьте передать DataFrame функции, а не x и y для большего удобства в вашем коде.

1 голос
/ 04 июля 2019

Вы можете использовать DataFrame.agg для нескольких функций агрегирования, а затем sum на axis=1:

df.groupby('A').agg({'B':'size', 'C':'sum'}).sum(1).reset_index(name='D')

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