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

Есть ли способ объединить столбец pandas STRINGS в пользовательские группы пользовательских имен. Подобно функции cuts, но для строк.

Например, возможно, использование списка списков для определения групп.

grouping_lists = [['Pakistan', 'China', 'Iran'], ['Germany', 'UK', 'Poland'], 
                  ['Australia'], ['USA']] 

Соответствует именам ['Asia', 'Europe', 'Australia', 'Other'].

И если что-то не существует в списке, оно помечается как 'Other' или как-то.

Пример:

          my_id  country_name
    0     100     Pakistan
    1     200     Germany
    2     140     Australia
    3     400     Germany
    4     225     China
    5     125     Pakistan
    6     600     Poland
    7       0     Austria


          my_id  country_name  Groups
    0     100     Pakistan      Asia
    1     200     Germany       Europe
    2     140     Australia     Australia
    3     400     Germany       Europe
    4     225     China         Asia
    5     125     Pakistan      Asia 
    6     600     Poland        Europe
    7       0     Austria       Other

Ответы [ 3 ]

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

Вот способ, при котором вам не нужно вручную создавать диктат карты (если он большой):

grouping_lists = [['Pakistan', 'China', 'Iran'], ['Germany', 'UK', 'Poland'], 
                  ['Australia'], ['USA']] 
names =  ['Asia', 'Europe', 'Australia', 'Other']

# create a df with mapping information
maps = (pd.DataFrame({'Groups': names, 'country_name': grouping_lists})
        .explode('country_name')
        .reset_index(drop=True))

# join maps
df = df.merge(maps, on = 'country_name', how='left').fillna("Other")

   my_id country_name     Groups
0    100     Pakistan       Asia
1    200      Germany     Europe
2    140    Australia  Australia
3    400      Germany     Europe
4    225        China       Asia
5    125     Pakistan       Asia
6    600       Poland     Europe
7      0      Austria      Other
0 голосов
/ 15 января 2020

Вы можете использовать лямбду, если не беспокоитесь о скорости.

groups = {
    "Asia": ["Pakistan", "China", "Iran"],
    "Europe": ["Germany", "UK", "Poland"],
    "Australia": ["Australia"],
}
df["Groups"] = (
    df["country_names"]
    .apply(lambda x: [k for k in groups.keys() if x in groups[k]])
    .str[0]
    .fillna("Other")
)
0 голосов
/ 15 января 2020

Вместо того, чтобы объединять свои ответы, вы можете изменить свои списки группировки на словарь, а затем использовать pandas.Series.map

country_map = {
    'Pakistan': 'Asia', 'China': 'Asia', 
    'Iran': 'Asia', 'Germany': 'Europe', 
    'UK': 'Europe', 'Poland': 'Europe', 
    'Australia': 'Australia', 'USA': 'Other'
}

df.assign(Groups=df.country_name.map(country_map)).fillna('Other')

   my_id country_name     Groups
0    100     Pakistan       Asia
1    200      Germany     Europe
2    140    Australia  Australia
3    400      Germany     Europe
4    225        China       Asia
5    125     Pakistan       Asia
6    600       Poland     Europe
7      0      Austria      Other
...