web-dev-qa-db-fra.com

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

J'ai un cadre de données avec une colonne appelée "Date" et je souhaite que toutes les valeurs de cette colonne aient la même valeur (l'année uniquement). 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 arrive que dans mes DataFrames, appelés par exemple fr['1961'], les valeurs de Date_of_incorporation puissent être n'importe quoi (chaînes, entier, etc.), il serait donc peut-être préférable d'effacer complètement cette colonne, puis d'attacher une autre colonne avec uniquement l'année aux DataFrames?

48
brodrigues

Comme @DSM le souligne, vous pouvez le faire plus directement en utilisant les méthodes de chaîne vectorisée :

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

Ou en utilisant extrait (en supposant qu'il n'y ait qu'un seul jeu de chiffres de longueur 4 quelque part dans chaque chaîne):

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

Une autre méthode légèrement plus souple consiste à 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 Date et la convertit en année.
Vous pourriez (et devriez peut-être) écrire ceci plus verbalement comme:

def convert_to_year(date_in_some_format);
    date_as_string = str(date_in_some_format)
    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 'Année' est un meilleur nom pour cette colonne ...

80
Andy Hayden

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 float.

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)
9
nim94

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

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