Что применяет метод в pandas dataframe передать к примененной функции - PullRequest
1 голос
/ 17 марта 2020

Я новичок в pandas и мне любопытно, что именно pandas передать функции, указанной в параметре apply метода. Вот пример из введения науки о данных в python курс

со следующими данными:

                       Category  Quantity  Weight (oz.)
Item                                                   
Pack                       Pack         1          33.0
Tent                    Shelter         1          80.0
Sleeping Pad              Sleep         1          27.0
Sleeping Bag              Sleep         1          20.0
Toothbrush/Toothpaste    Health         1           2.0
Sunscreen                Health         1           5.0
Medical Kit              Health         1           3.7
Spoon                   Kitchen         1           0.7
Stove                   Kitchen         1          20.0
Water Filter            Kitchen         1           1.8
Water Bottles           Kitchen         2          35.0
Pack Liner              Utility         1           1.0
Stuff Sack              Utility         1           1.0
Trekking Poles          Utility         1          16.0
Rain Poncho            Clothing         1           6.0
Shoes                  Clothing         1          12.0
Hat                    Clothing         1           2.5

Цель состоит в том, чтобы вычислить общий вес (Вес х Количество) по категориям. Я уже понимаю, что нам нужно использовать метод Groupby, чтобы разделить данные на куски, а затем применить apply, чтобы сделать все остальное.

Вот правильный ответ на вопрос:

print(df.groupby('Category').apply(lambda df,a,b: sum(df[a] * df[b]), 'Weight (oz.)', 'Quantity'))

Вот где я запутался. Я не знаю, почему это будет работать. Что именно Pandas передает анонимной функции? Всегда ли это сначала сам Dataframe, а затем имена столбцов (если указаны)?

Буду очень признателен, если вы поможете мне понять это

Ответы [ 2 ]

3 голосов
/ 17 марта 2020

Я думаю, вам нужно сначала несколько столбцов, а затем агрегировать sum:

df['Weight (oz.)'].mul(df['Quantity']).groupby(df['Category']).sum().reset_index(name='wsum')

Или:

(df.assign(wsum = df['Weight (oz.)'].mul(df['Quantity']))
   .groupby('Category', as_index=False)['wsum'].sum())

Ваше решение должно быть изменено на несколько групп, но если оно большое DataFrame или многие группы это медленно:

df1 = (df.groupby('Category')     
        .apply(lambda x: (x['Weight (oz.)'] * x['Quantity']).sum()).reset_index(name='wsum'))

Я не знаю, почему это будет работать. Что именно Pandas передает анонимной функции? Всегда ли это сначала сам Dataframe, а затем имена столбцов (если указаны)?

Я думаю, что причина должна быть pandas в отображении лямбда-переменных, поэтому df сопоставляется с каждой группой, a сопоставляется со строкой Weight (oz.) и b со строкой Quantity:

print(df.groupby('Category').apply(lambda df,a,b: print (df), 'Weight (oz.)', 'Quantity'))
print(df.groupby('Category').apply(lambda df,a,b: print (a), 'Weight (oz.)', 'Quantity'))
print(df.groupby('Category').apply(lambda df,a,b: print (b), 'Weight (oz.)', 'Quantity'))

Но это действительно не стандартный способ для pandas передачи имен столбцов в функциях.

1 голос
/ 17 марта 2020
print(df.groupby('Category').apply(lambda df,a,b: sum(df[a] * df[b])

в приведенном выше коде, как вы уже сказали, первый - это фрейм данных, но python знает только, что a, b - просто идентификаторы. Но когда вы передаете a и b как индекс, df [a] - python неявно преобразуется в индекс

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