J'ai un df comme ci-dessous:

Index  Site     Name
  0    Site_1   Tom
  1    Site_2   Tom
  2    Site_4   Jack
  3    Site_8   Rose
  5    Site_11  Marrie
  6    Site_12  Marrie
  7    Site_21  Jacob
  8    Site_34  Jacob

Je voudrais supprimer le 'Site_' et ne laisser que le nombre dans la colonne "Site", comme indiqué ci-dessous:

Index   Site     Name
  0      1       Tom
  1      2       Tom
  2      4       Jack
  3      8       Rose
  5      11      Marrie
  6      12      Marrie
  7      21      Jacob
  8      34      Jacob

Quelle est la meilleure façon de faire cette opération?

2
FunkyMore 12 avril 2018 à 02:18

5 réponses

Meilleure réponse

Utilisation de pd.Series.str.extract

Cela produit une copie avec des colonnes mises à jour

df.assign(Site=df.Site.str.extract('\D+(\d+)', expand=False))

      Site    Name
Index             
0        1     Tom
1        2     Tom
2        4    Jack
3        8    Rose
5       11  Marrie
6       12  Marrie
7       21   Jacob
8       34   Jacob

Pour conserver les résultats, réaffectez-les au nom du bloc de données

df = df.assign(Site=df.Site.str.extract('\D+(\d+)', expand=False))

Utilisation de pd.Series.str.split

df.assign(Site=df.Site.str.split('_', 1).str[1])

Alternative

Mettre à jour au lieu de produire une copie

df.update(df.Site.str.extract('\D+(\d+)', expand=False))
# Or
# df.update(df.Site.str.split('_', 1).str[1])
df

      Site    Name
Index             
0        1     Tom
1        2     Tom
2        4    Jack
3        8    Rose
5       11  Marrie
6       12  Marrie
7       21   Jacob
8       34   Jacob
1
piRSquared 11 avril 2018 à 23:45

Vous pouvez utiliser exactement ce que vous vouliez (la méthode strip)

>>> df["Site"] = df.Site.str.strip("Site_")

Production

Index   Site     Name
  0      1       Tom
  1      2       Tom
  2      4       Jack
  3      8       Rose
  5      11      Marrie
  6      12      Marrie
  7      21      Jacob
  8      34      Jacob
0
rafaelc 11 avril 2018 à 23:57

Appelez simplement replace dans la colonne pour remplacer toutes les instances de "Site_":

df['Site'] = df['Site'].str.replace('Site_', '')
0
Simon 11 avril 2018 à 23:26

Utilisez .apply() pour appliquer une fonction à chaque élément d'une série:

df['Site Name'] = df['Site Name'].apply(lambda x: x.split('_')[-1])
0
Mark Tyler 11 avril 2018 à 23:48

Faites un tableau composé des noms que vous voulez. Appelez ensuite yourarray = pd.DataFrame (yourpd, columns = yournamearray)

0
WhoAmIWhereAmIWhatIAmDoing 11 avril 2018 à 23:23