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> correspondant à des noms Exemple: P> ["Asie", "Europe", "Australie", "Autre"] P> P> P> Et si quelque chose n'existe pas dans la liste, il est marqué comme
'autre'
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 Réponses :
Au lieu de boire de vos réponses, vous pouvez modifier vos listes de regroupement pour être un dictionnaire, puis utiliser pandas.series.map code>
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?
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
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") )