-1
votes

Comment faire passer des valeurs de chaîne en fonction de la liste des chaînes?

Y a-t-il un moyen de bin d'une colonne de pandas de chaînes dans des groupes personnalisés de noms personnalisés. Comme semblable à la fonction CUTS, mais pour les chaînes.

Par exemple peut-être utiliser une liste de listes pour définir quels groupes sont. p> xxx pré>

correspondant à des noms ["Asie", "Europe", "Australie", "Autre"] P> P> P> Et si quelque chose n'existe pas dans la liste, il est marqué comme 'autre' ou quelque chose. P>

Exemple: P>

          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


0 commentaires

3 Réponses :


0
votes

Au lieu de boire de vos réponses, vous pouvez modifier vos listes de regroupement pour être un dictionnaire, puis utiliser pandas.series.map xxx


3 commentaires

Hmmm qui pourrait fonctionner. Mais existe-t-il un moyen d'utiliser la valeur «Autre» pour une chaîne jamais spécifiée?


Je veux aussi le rendre plus dynamique. Afin que la liste des listes puisse être n'importe quoi et ne pas être codée dur. C'est le problème principal que j'ai.


Voulez-vous dire comment créer de manière dynamique le dictionnaire?



0
votes

Voici une solution où vous ne pouvez pas avoir besoin de créer une carte dict manuellement (au cas où il est grand):

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 commentaires

0
votes

Vous pouvez utiliser un lambda si vous n'êtes pas inquiet de la vitesse.

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 commentaires