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

87

J'ai un bloc 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ées par exemple, fr['1961']les valeurs de Date_of_incorporationpeuvent être n'importe quoi (chaînes, entier, etc.), alors peut-être serait-il préférable d'effacer complètement cette colonne, puis d'attacher une autre colonne avec seulement l'année aux DataFrames?

brodrigues
la source
1
Chaînes et nombres selon qu'il n'y a que l'année (comme pour Madrid dans l'exemple), ou s'il y a aussi le mois et le jour (comme pour Pékin et Paris).
brodrigues du

Réponses:

128

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

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

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

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

Une alternative légèrement plus flexible pourrait être d'utiliser apply(ou de manière équivalente map) pour faire ceci:

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 du Dateet la convertit en un an.
Vous pourriez (et devriez peut-être) écrire ceci de manière plus verbeuse comme suit:

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 que «Année» est un meilleur nom pour cette colonne ...

Andy Hayden
la source
1
Merci pour la réponse, mais c'est plus compliqué que ça: parfois, les valeurs sont tout autre chose (comme des caractères). Je pense qu'il serait plus simple de supprimer complètement cette colonne, puis d'en ajouter une nouvelle avec l'année, ou de remplacer complètement les valeurs par l'année.
brodrigues du
1
@cbrunos Pouvez-vous donner un exemple où cela ne fonctionne pas? (Mais vous pouvez ajuster le convert_to_yearpour y faire face) ... Je conviens qu'un nom plus approprié serait df['Year'].
Andy Hayden
1
@cbrunos Cela devrait bien pour vous: for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year).
Andy Hayden le
Ces jours-ci, je fais souvent des choses comme df["Date"].str[-4:].astype(int).
DSM
1
@dmvianna ou peuts.str.extract('(?P<year>\d{4})')
Andy Hayden
29

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)
nim94
la source
3

Ou si l'on veut utiliser la lambdafonction dans la applyfonction:

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