web-dev-qa-db-fra.com

Essayer de supprimer les virgules et les symboles dollars avec les pandas en Python

Tring pour supprimer les virgules et les signes dollars des colonnes. Mais lorsque je le fais, la table les imprime et les conserve encore. Existe-t-il un moyen différent d’enlever les signes de virement et de virement en utilisant une fonction pandas? Je ne pouvais rien trouver dans les documents de l'API ou peut-être que je cherchais au mauvais endroit

 import pandas as pd
    import pandas_datareader.data as web

players = pd.read_html('http://www.usatoday.com/sports/mlb/salaries/2013/player/p/')


df1 = pd.DataFrame(players[0])


df1.drop(df1.columns[[0,3,4, 5, 6]], axis=1, inplace=True)
df1.columns = ['Player', 'Team', 'Avg_Annual']
df1['Avg_Annual'] = df1['Avg_Annual'].replace(',', '')

print (df1.head(10))
15
Mark

Vous devez accéder à l'attribut str par http://pandas.pydata.org/pandas-docs/stable/text.html

df1['Avg_Annual'] = df1['Avg_Annual'].str.replace(',', '')
df1['Avg_Annual'] = df1['Avg_Annual'].str.replace('$', '')
df1['Avg_Annual'] = df1['Avg_Annual'].astype(int)
39
bernie

Volé sans vergogne à partir de cette réponse ... mais, cette réponse ne concerne que la modification d’un caractère et ne complète pas la fraîcheur: comme il faut un dictionnaire, vous pouvez remplacer n’importe quel nombre de caractères à la fois, ainsi que dans n'importe quel nombre de colonnes.

# if you want to operate on multiple columns, put them in a list like so:
cols = ['col1', 'col2', ..., 'colN']

# pass them to df.replace(), specifying each char and it's replacement:
df[cols] = df[cols].replace({'\$': '', ',': ''}, regex=True)

@shivsn a remarqué que vous devez utiliser regex=True; vous saviez déjà sur remplacer (mais vous n'avez pas non plus essayé d'essayer de l'utiliser sur plusieurs colonnes ou à la fois avec le signe dollar et la virgule).

Cette réponse résume simplement les détails que j’ai trouvés d’autres au même endroit pour ceux qui me ressemblent (par exemple, noobs to python et pandas). J'espère que c'est utile.

8
Hendy

La réponse de @ bernie est parfaite pour votre problème. Voici mon point de vue sur le problème général du chargement de données numériques dans des pandas.

Souvent, la source des données est constituée de rapports générés pour la consommation directe. D'où la présence de formats supplémentaires tels que %, le séparateur de milliers, les symboles de devise, etc. Tous ces éléments sont utiles pour la lecture, mais posent des problèmes pour l'analyseur par défaut. Ma solution est de transtyper la colonne en chaîne, de remplacer ces symboles un par un, puis de la redonner aux formats numériques appropriés. Avoir une fonction standard qui ne retient que [0-9.] est tentant mais pose des problèmes lorsque le séparateur et le nombre décimal sont échangés, même en cas de notation scientifique. Voici mon code que j'emballe dans une fonction et applique au besoin.

df[col] = df[col].astype(str)  # cast to string

# all the string surgery goes in here
df[col] = df[col].replace('$', '')
df[col] = df[col].replace(',', '')  # assuming ',' is the thousand's separator in your locale
df[col] = df[col].replace('%', '')

df[col] = df[col].astype(float)  # cast back to appropriate type
1
BiGYaN