114 votes

Pandas : comment changer toutes les valeurs d'une colonne ?

J'ai un cadre de données avec une colonne appelée "Date" et je veux que toutes les valeurs de cette colonne aient la même valeur (l'année seulement). Exemple :

City     Date
Paris    01/04/2004
Lisbon   01/09/2004
Madrid   2004
Pekin    31/2004

Ce que je veux, c'est :

City     Date
Paris    2004
Lisbon   2004
Madrid   2004
Pekin    2004

Voici mon code :

fr61_70xls = pd.ExcelFile('AMADEUS FRANCE 1961-1970.xlsx')

#Here we import the individual sheets and clean the sheets    
years=(['1961','1962','1963','1964','1965','1966','1967','1968','1969','1970'])

fr={}

header=(['City','Country','NACE','Cons','Last_year','Op_Rev_EUR_Last_avail_yr','BvD_Indep_Indic','GUO_Name','Legal_status','Date_of_incorporation','Legal_status_date'])

for year in years:
    # save every sheet in variable fr['1961'], fr['1962'] and so on
    fr[year]=fr61_70xls.parse(year,header=0,parse_cols=10)
    fr[year].columns=header
    # drop the entire Legal status date column
    fr[year]=fr[year].drop(['Legal_status_date','Date_of_incorporation'],axis=1)
    # drop every row where GUO Name is empty
    fr[year]=fr[year].dropna(axis=0,how='all',subset=[['GUO_Name']])
    fr[year]=fr[year].set_index(['GUO_Name','Date_of_incorporation'])

_Il se trouve que dans mes DataFrames, appelés par exemple fr['1961'] les valeurs de Date_of_incorporation peut être n'importe quoi (chaînes de caractères, nombres entiers, etc.), alors peut-être serait-il préférable d'effacer complètement cette colonne et de joindre une autre colonne contenant uniquement l'année aux DataFrames ?_

168voto

Andy Hayden Points 38010

Comme l'indique @DSM, vous pouvez le faire plus directement en utilisant la fonction méthodes de chaînes vectorisées :

df['Date'].str[-4:].astype(int)

Ou en utilisant l'extraction (en supposant qu'il n'y ait qu'une seule série de chiffres de longueur 4 quelque part dans chaque chaîne) :

df['Date'].str.extract('(?P<year>\d{4})').astype(int)

Une autre solution, un peu plus souple, pourrait être d'utiliser apply (ou de manière équivalente map ) pour ce faire :

df['Date'] = df['Date'].apply(lambda x: int(str(x)[-4:]))
             #  converts the last 4 characters of the string to an integer

La fonction lambda, prend l'entrée de la fonction Date et de le convertir en année.
Vous pourriez (et devriez peut-être) écrire ceci plus verbeusement comme :

def convert_to_year(date_in_some_format):
    date_as_string = str(date_in_some_format)  # cast to string
    year_as_string = date_in_some_format[-4:] # last four characters
    return int(year_as_string)

df['Date'] = df['Date'].apply(convert_to_year)

Peut-être que "Année" serait un meilleur nom pour cette rubrique...

31voto

nim94 Points 77

Vous pouvez effectuer une transformation de colonne en utilisant apply

Définissez une fonction propre pour supprimer le dollar et les virgules et convertir vos données en flottant.

def clean(x):
    x = x.replace("$", "").replace(",", "").replace(" ", "")
    return float(x)

Ensuite, appelez-le sur votre colonne comme ceci.

data['Revenue'] = data['Revenue'].apply(clean)

8voto

Tanmay Points 21

Ou si l'on veut utiliser lambda dans le apply fonction :

data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X