Ich habe einen Datenrahmen mit einer Spalte namens "Date"
und möchte, dass alle Werte aus dieser Spalte denselben Wert haben (nur das Jahr). Beispiel:
City Date
Paris 01/04/2004
Lisbon 01/09/2004
Madrid 2004
Pekin 31/2004
Was ich will ist:
City Date
Paris 2004
Lisbon 2004
Madrid 2004
Pekin 2004
Hier ist mein 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'])
Es kommt vor, dass in meinen DataFrames, die zum Beispiel aufgerufen werden, fr['1961']
die Werte von Date_of_incorporation
beliebig sein können (Zeichenfolgen, Ganzzahlen usw.). Vielleicht ist es am besten, diese Spalte vollständig zu löschen und dann eine weitere Spalte mit nur dem Jahr an die DataFrames anzuhängen.
Antworten:
Wie @DSM hervorhebt, können Sie dies direkter mit den vektorisierten Zeichenfolgenmethoden tun :
df['Date'].str[-4:].astype(int)
Oder verwenden Sie den Extrakt (vorausgesetzt, es gibt nur einen Satz Ziffern der Länge 4 irgendwo in jeder Zeichenfolge):
df['Date'].str.extract('(?P<year>\d{4})').astype(int)
Eine etwas flexiblere Alternative könnte darin bestehen
apply
(oder gleichwertigmap
), dies zu tun:df['Date'] = df['Date'].apply(lambda x: int(str(x)[-4:])) # converts the last 4 characters of the string to an integer
Die Lambda-Funktion nimmt die Eingabe von
Date
und konvertiert sie in ein Jahr.Sie könnten (und sollten vielleicht) dies ausführlicher schreiben als:
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)
Vielleicht ist 'Jahr' ein besserer Name für diese Kolumne ...
quelle
convert_to_year
um damit umzugehen) ... Ich stimme zu, dass ein passenderer Name wäredf['Year']
.for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year)
.df["Date"].str[-4:].astype(int)
.s.str.extract('(?P<year>\d{4})')
Sie können eine Spaltentransformation mit verwenden
apply
Definieren Sie eine saubere Funktion, um den Dollar und die Kommas zu entfernen und Ihre Daten in Float umzuwandeln.
def clean(x): x = x.replace("$", "").replace(",", "").replace(" ", "") return float(x)
Rufen Sie es als Nächstes in Ihrer Spalte so auf.
data['Revenue'] = data['Revenue'].apply(clean)
quelle
Oder wenn man die
lambda
Funktion in derapply
Funktion verwenden möchte :data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))
quelle