Подсчитайте, сколько раз значение встречается во фрейме данных pandas на основе условия

#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"])