Pandas: Wie ändere ich alle Werte einer Spalte?

87

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

Brodrigues
quelle
1
Zeichenfolgen und Zahlen hängen davon ab, ob es nur das Jahr gibt (wie im Beispiel für Madrid) oder ob es auch den Monat und den Tag gibt (wie für Pekin und Paris).
Brodrigues

Antworten:

128

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 gleichwertig map), 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 Dateund 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 ...

Andy Hayden
quelle
1
Vielen Dank für die Antwort, aber es ist komplizierter: Manchmal sind die Werte etwas ganz anderes (wie Zeichen). Ich denke, es wäre einfacher, diese Spalte vollständig zu löschen und dann eine neue mit dem Jahr hinzuzufügen oder die Werte vollständig durch das Jahr zu ersetzen.
Brodrigues
1
@cbrunos Könnten Sie bitte ein Beispiel nennen, bei dem dies nicht funktioniert? (Aber Sie können das anpassen, convert_to_yearum damit umzugehen) ... Ich stimme zu, dass ein passenderer Name wäre df['Year'].
Andy Hayden
1
@cbrunos Dies sollte für Sie gut funktionieren : for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year).
Andy Hayden
In diesen Tagen mache ich oft Dinge wie df["Date"].str[-4:].astype(int).
DSM
1
@dmvianna oder vielleichts.str.extract('(?P<year>\d{4})')
Andy Hayden
29

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)
nim94
quelle
2

Oder wenn man die lambdaFunktion in der applyFunktion verwenden möchte :

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