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?
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 ...
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)
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(" ", "")))