#python #python-3.x #pandas #dataframe
Вопрос:
Я пытаюсь вычислить, сколько раз значение встречается в определенном месте внутри фрейма данных.
В качестве примера я использую этот фрейм данных:
import pandas as pd
d = {'Fruit': ['Apple', 'Apple', 'Apple', 'Onion', 'Onion', 'Onion', 'Onion', 'Pear', 'Pear', 'Pear',
'Pear', 'Pear'],
'Country': ['USA', 'SUI', 'USA', 'SUI', 'USA', 'SUI', 'SUI', 'USA', 'USA', 'USA', 'SUI', 'SUI']}
df = pd.DataFrame(data=d)
Я не понимаю, как я могу, например, рассчитать, сколько яблок в США и SUI, и добавить это в столбец «Количество».
Результат должен выглядеть примерно так:
import pandas as pd
d = {'Fruit': ['Apple', 'Apple', 'Apple', 'Onion', 'Onion', 'Onion', 'Onion', 'Pear', 'Pear', 'Pear', 'Pear', 'Pear'],
'Country': ['USA', 'SUI', 'USA', 'SUI', 'USA', 'SUI', 'SUI', 'USA', 'USA', 'USA', 'SUI', 'SUI'],
'Count': [2, 1, 2, 3, 1, 3, 3, 3, 3, 3, 2, 2]}
df = pd.DataFrame(data=d)
Я бы знал, как подсчитать сами значения (сколько яблок встречается в столбце «Фрукты»), но не знал, как добавить это условие в расчет.
Заранее спасибо за вашу помощь.
Ответ №1:
Попробуйте Групповое преобразование:
df['counts'] = df.groupby(['Fruit', 'Country'])['Country'].transform('size')
df
:
Fruit Country counts
0 Apple USA 2
1 Apple SUI 1
2 Apple USA 2
3 Onion SUI 3
4 Onion USA 1
5 Onion SUI 3
6 Onion SUI 3
7 Pear USA 3
8 Pear USA 3
9 Pear USA 3
10 Pear SUI 2
11 Pear SUI 2
Ответ №2:
Вы можете использовать groupby
с последующим join
, как это:
fruit_counts = df.groupby(["Fruit", "Country"]).size().rename("Count")
df.join(fruit_counts, on=["Fruit", "Country"])
Выход:
Fruit Country Count
0 Apple USA 2
1 Apple SUI 1
2 Apple USA 2
3 Onion SUI 3
4 Onion USA 1
5 Onion SUI 3
6 Onion SUI 3
7 Pear USA 3
8 Pear USA 3
9 Pear USA 3
10 Pear SUI 2
11 Pear SUI 2
Комментарии:
1. Просто обратите внимание, что вы можете вызвать
reset_index()
fruit_count и избежать соединения.2. @PoPhoRmA
join
создает новый фрейм данных, поэтому вы должны назначить его обратноdf
следующим образом:df = df.join(fruit_counts, on=["Fruit", "Country"])