web-dev-qa-db-fra.com

Pandas Dataframe: division d'une colonne en plusieurs colonnes, entrées de cellules incohérentes alignées à droite

J'ai un pandas dataframe avec une colonne nommée 'Ville, État, Pays'. Je souhaite séparer cette colonne en trois nouvelles colonnes, 'Ville,' État 'et' Pays '.

0                 HUN
1                 ESP
2                 GBR
3                 ESP
4                 FRA
5             ID, USA
6             GA, USA
7    Hoboken, NJ, USA
8             NJ, USA
9                 AUS

Diviser la colonne en trois colonnes est assez simple:

location_df = df['City, State, Country'].apply(lambda x: pd.Series(x.split(',')))

Cependant, cela crée des données alignées à gauche:

     0       1       2
0    HUN     NaN     NaN
1    ESP     NaN     NaN
2    GBR     NaN     NaN
3    ESP     NaN     NaN
4    FRA     NaN     NaN
5    ID      USA     NaN
6    GA      USA     NaN
7    Hoboken  NJ     USA
8    NJ      USA     NaN
9    AUS     NaN     NaN

Comment pourrait-on créer les nouvelles colonnes avec les données alignées à droite? Aurais-je besoin de parcourir chaque ligne, de compter le nombre de virgules et de gérer le contenu individuellement?

44
jamesbev

Je ferais quelque chose comme ce qui suit:

foo = lambda x: pd.Series([i for i in reversed(x.split(','))])
rev = df['City, State, Country'].apply(foo)
print rev

      0    1        2
0   HUN  NaN      NaN
1   ESP  NaN      NaN
2   GBR  NaN      NaN
3   ESP  NaN      NaN
4   FRA  NaN      NaN
5   USA   ID      NaN
6   USA   GA      NaN
7   USA   NJ  Hoboken
8   USA   NJ      NaN
9   AUS  NaN      NaN

Je pense que cela vous donne ce que vous voulez, mais si vous voulez aussi créer de jolies choses et obtenir un ordre de colonne Ville, État, Pays, vous pouvez ajouter ce qui suit:

rev.rename(columns={0:'Country',1:'State',2:'City'},inplace=True)
rev = rev[['City','State','Country']]
print rev

     City State Country
0      NaN   NaN     HUN
1      NaN   NaN     ESP
2      NaN   NaN     GBR
3      NaN   NaN     ESP
4      NaN   NaN     FRA
5      NaN    ID     USA
6      NaN    GA     USA
7  Hoboken    NJ     USA
8      NaN    NJ     USA
9      NaN   NaN     AUS
48
Karl D.

Puisque vous avez affaire à des chaînes, je suggérerais l’amendement à votre code actuel, c’est-à-dire.

location_df = df[['City, State, Country']].apply(lambda x: pd.Series(str(x).split(',')))

Le mien a été testé en testant l’une des colonnes, mais essayez celui-ci.

8
Naufal

Supposons que le nom de la colonne soit cible

df [['' Ville, Etat, Pays '']] = df ['cible']. str.split (pat = ',', expand = True)

0
Dolittle Wang