Проблемы с добавлением ключевых аргументов в функцию 'apply' при использовании вместе с 'groupby' на фрейме данных Pandas - PullRequest
1 голос
/ 13 февраля 2020

Допустим, у меня есть фрейм данных:

            States             Col_A     Col_B      Col_C    
 ----------------------    ----------- ---------- ---------  
           Alabama              10        40          70    
           Alabama              5         30          60     
           Alabama              15        20          80   
           Alaska               20        50          80    
           Alaska               20        40          100   

И я хотел бы получить сумму (Col_A) * сумма (Col_B) / сумма (Col_ C), где суммы применяются отдельно для каждого состояния и поместите результаты в новый столбец с именем Col_D. Таким образом, в основном это будет выглядеть так:

            States             Col_A     Col_B      Col_C     Col_D
 ----------------------    ----------- ---------- --------- --------- 
           Alabama              10        40          70      12.86
           Alabama              5         30          60      12.86 
           Alabama              15        20          80      12.86
           Alaska               20        50          80      20
           Alaska               20        40          100     20

Где 12,86 равно (10 + 5 + 15) * (40 + 30 + 20) / (70 + 60 + 80).

Я пытаюсь использовать:

my_df['Col_D'] = my_df.groupby('States').apply(lambda x: sum(x['Col_A'])*sum(x['Col_B'])/sum(x['Col_C']),result_type = 'broadcast')

, но получаю сообщение об ошибке:

<lambda>() got an unexpected keyword argument 'result_type'

Это меня очень смущает, так как я пытаюсь получить ключевое слово аргумент result_type использоваться для функции apply, а не для лямбда-функции. И когда я пытаюсь применить ту же логику c на обычном фрейме данных (то есть не группировать), он работает отлично. Я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Используйте GroupBy.transform для вспомогательного DataFrame с тем же размером, что и исходные данные, заполненные совокупными значениями, а затем обработанные по кратному и делению:

df = my_df.groupby('States').transform('sum')
my_df['Col_D'] = df['Col_A'] * df['Col_B'] / df['Col_C']
print (my_df)
    States  Col_A  Col_B  Col_C      Col_D
0  Alabama     10     40     70  12.857143
1  Alabama      5     30     60  12.857143
2  Alabama     15     20     80  12.857143
3   Alaska     20     50     80  20.000000
4   Alaska     20     40    100  20.000000

Detail :

print (df)
   Col_A  Col_B  Col_C
0     30     90    210
1     30     90    210
2     30     90    210
3     40     90    180
4     40     90    180

Если требуется решение с помощью GroupBy.apply, создать пользовательскую функцию, назначить новый столбец и вернуть все значения x:

def f(x):
    x['Col_D'] = x['Col_A'].sum() * x['Col_B'].sum()  / x['Col_C'].sum() 
    return x

df = my_df.groupby('States').apply(f)
print (df)
    States  Col_A  Col_B  Col_C      Col_D
0  Alabama     10     40     70  12.857143
1  Alabama      5     30     60  12.857143
2  Alabama     15     20     80  12.857143
3   Alaska     20     50     80  20.000000
4   Alaska     20     40    100  20.000000
0 голосов
/ 13 февраля 2020

Посмотрите документацию:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.apply.html

Это говорит о том, что параметры result_type работают, только если вы установите ось параметра = 1.

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