Как я могу получить самый популярный предмет в группе в пандах? - PullRequest
0 голосов
/ 15 января 2019

У меня есть Pandas Dataframe, содержащий автомобили для продажи, и я хотел бы получить наибольшую популярность для каждой марки, однако мне кажется, что я не могу этого сделать.

У меня есть датафрейм pandas с несколькими столбцами (например, тип транспортного средства, цена, пробег, год, марка, модель и т. Д.), И для каждой марки автомобиля я хотел бы проверить, какая модель встречается чаще всего. Я пытался использовать групповое, как это:

popular_models = dataset.groupby('brand').model.value_counts().groupby(level=0).nlargest(1)

Но он возвращает серию Pandas, в которой часть нужных мне данных хранится в индексах, а также добавляет один повторяющийся столбец, который не имеет никакого смысла для меня.

Я хотел бы получить DataFrame, содержащий 3 столбца, например:

(https://imgur.com/a/BkKBrv9)

Однако я получаю серию панд, подобную этой:

(https://imgur.com/a/u8CSXY4)

Может кто-нибудь помочь мне разобраться?

Ответы [ 3 ]

0 голосов
/ 15 января 2019

Одним из решений является сортировка, а затем удаление дубликатов после операции groupby:

df = pd.DataFrame({'Brand': ['B1'] * 5 + ['B2'] * 5,
                   'Model': ['M1', 'M2', 'M1', 'M2', 'M3',
                             'N1', 'N1', 'N2', 'N3', 'N1']})

df['Count'] = df.groupby(['Brand', 'Model'])['Model'].transform('count')

res = df.sort_values('Count', ascending=False)\
        .drop_duplicates('Brand')

print(res)

#   Brand Model  Count
# 5    B2    N1      3
# 0    B1    M1      2

Обратите внимание, что при этом удаляются дубликаты групповых верхних значений.

0 голосов
/ 15 января 2019

Вот один подход.

  1. Настройка объекта DataFrameGroupBy:

    df.groupby(["Brand", "Model"])

  2. Используйте функцию GroupBy size для вычисления размеров каждой подгруппы (возвращается как серия):

    df.groupby(["Brand", "Model"]).size()

  3. Преобразование обратно в DataFrame с именем столбца, содержащего значения, вычисленные как size:

    df.groupby(["Brand", "Model"]).size().reset_index(name="Count")

  4. Сортировка фрейма данных в порядке убывания по Count элементов подгруппы:

    df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False)

  5. Удалить дубликаты Brand значений, сохраняя первую запись в DataFrame:

    df.groupby(["Brand", "Model"]).size().reset_index(name="Count").sort_values(by="Count", ascending=False).drop_duplicates("Brand", keep="first")

0 голосов
/ 15 января 2019

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

Brand   Model
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Acura   RDX
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
Beach   Baby
BMW     320i
BMW     320i
BMW     320i
BMW     320i
BMW     320i
BMW     320i
BMW     320i
BMW     550i
BMW     550i
BMW     550i
BMW     550i
BMW     550i
BMW     550i
BMW     550i
Cadillac        Escalade
Cadillac        Escalade
Cadillac        Escalade
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo
Chana   Cargo

Простые панды на одном вкладыше:

df = pd.read_table('fun.txt', header=0)
print(df.groupby(['Brand','Model'])['Model'].agg(['count']))

И вывод:

                   count
Brand    Model
Acura    RDX          10
BMW      320i          7
         550i          7
Beach    Baby         10
Cadillac Escalade      3
Chana    Cargo        12

Если вы хотите отсортировать значения по частоте (от наибольшего к наименьшему) и оставить только самое большое, измените однострочник на:

groupby_df = (df.groupby(['Brand','Model'])['Model'].agg(['count']).sort_values(by='count', ascending=False).reset_index().drop_duplicates('Brand', keep='first'))

чтобы получить:

      Brand     Model  count
0     Chana     Cargo     12
1     Acura       RDX     10
2     Beach      Baby     10
3       BMW      320i      7
5  Cadillac  Escalade      3
...