Панды: есть ли способ сгруппировать значения в столбце? - PullRequest
0 голосов
/ 06 октября 2018

Я использую панд для сжатия DataFrame, в котором один столбец называется "Rank", для военного звания.Когда я использую groupby для данных и создаю crosstab, я замечаю, что некоторые значения в Rank являются синонимами.Например, в моей кросс-таблице есть отдельные строки для «Частный 1-й класс», «Частный первый класс» и «PFC».

Предполагая , я могу вручную создать словарь для связивсе эти «синонимы» вместе, есть ли способ заставить панд применить его к моему DataFrame, чтобы все значения считались одинаковыми для целей подсчетов, перекрестных таблиц и т. д.?Поэтому для приведенного выше примера, если бы я решил стандартизировать «PFC», я бы создал следующее: {"Private 1st Class": "PFC", "Private First Class": "PFC"}.

Я посмотрел на groupby, но, насколько я могу судить, он сортирует весь кадрпо столбцам, и не поддерживает эквивалентные значения, как это.Если я ошибаюсь, может кто-нибудь указать мне соответствующую часть документации?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

используйте карту со своим словарем для создания нового столбца:

import pandas as pd
df = pd.DataFrame([
    ('Private 1st Class', 3),
    ('Private First Class', 2),
    ('PFC', 5),
    ('Sergeant', 2),
    ('SGT', 2)
], columns = ['rank', 'bannanas'])

d = {
    'Private 1st Class': 'PFC',
    'Private First Class': 'PFC',
    'PFC': 'PFC',
    'Sergeant': 'SGT',
    'SGT': 'SGT'
}

df['merged_rank'] = df['rank'].map(d)
print(df)
                  rank  bannanas merged_rank
0    Private 1st Class         3         PFC
1  Private First Class         2         PFC
2                  PFC         5         PFC
3             Sergeant         2         SGT
4                  SGT         2         SGT

print(df.groupby('merged_rank')['bannanas'].agg('sum'))   

merged_rank
PFC    10
SGT     4
Name: bannanas, dtype: int64   
0 голосов
/ 06 октября 2018

Чтобы показать вам пример:

Данные:

df = pd.DataFrame({"val": [1,2,3,4,5], "key": ["Private 1st class", "Private First Class", "PFC", "other", "other"]})

Диктофон перевода:

translate = pd.DataFrame.from_records({"key": ["Private 1st class", "PFC", "Private First Class"],
                           "harmonizedkey": ["PFC", "PFC", "PFC"]})

Давайте объединим диктовку с df:

newdf = pd.merge(df, translate, how = "left", on = "key")

Создать новую (полную) группу:

newdf["newgroup"] = newdf["harmonizedkey"].combine_first(newdf["key"])
newdf

    key                 val harmonizedkey   newgroup
0   Private 1st class   1   PFC             PFC
1   Private First Class 2   PFC             PFC
2   PFC                 3   PFC             PFC
3   other               4   NaN             other
4   other               5   NaN             other

Теперь используйте groupby:

newdf.groupby("newgroup").sum()

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