Panda: come modificare tutti i valori di una colonna?


91

Ho un data frame con una colonna chiamata "Date"e voglio che tutti i valori di questa colonna abbiano lo stesso valore (solo l'anno). Esempio:

City     Date
Paris    01/04/2004
Lisbon   01/09/2004
Madrid   2004
Pekin    31/2004

Quello che voglio è:

City     Date
Paris    2004
Lisbon   2004
Madrid   2004
Pekin    2004

Ecco il mio codice:

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'])

Succede che nei miei DataFrame, chiamati ad esempio fr['1961']i valori di Date_of_incorporationpossono essere qualsiasi cosa (stringhe, interi e così via), quindi forse sarebbe meglio cancellare completamente questa colonna e quindi allegare un'altra colonna con solo l'anno ai DataFrames?


1
Stringhe e numeri a seconda che ci sia solo l'anno (come per Madrid nell'esempio), o se ci sia anche il mese e il giorno (come per Pechino e Parigi).
brodrigues

Risposte:


132

Come sottolinea @DSM, puoi farlo in modo più diretto utilizzando i metodi delle stringhe vettoriali :

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

O usando l'estratto (supponendo che ci sia solo un set di cifre di lunghezza 4 da qualche parte in ogni stringa):

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

Un modo alternativo leggermente più flessibile, potrebbe essere quello di utilizzare apply(o equivalentemente map) per fare questo:

df['Date'] = df['Date'].apply(lambda x: int(str(x)[-4:]))
             #  converts the last 4 characters of the string to an integer

La funzione lambda prende l'input da Datee lo converte in un anno.
Potresti (e forse dovresti) scriverlo in modo più verbale come:

def convert_to_year(date_in_some_format):
    date_as_string = str(date_in_some_format)  # cast to string
    year_as_string = date_in_some_format[-4:] # last four characters
    return int(year_as_string)

df['Date'] = df['Date'].apply(convert_to_year)

Forse "Anno" è un nome migliore per questa colonna ...


1
Grazie per la risposta, ma è più complicato di così: a volte i valori sono qualcosa di completamente diverso (come i caratteri). Penso che sarebbe più semplice eliminare completamente questa colonna e quindi aggiungerne una nuova con l'anno o sostituire completamente i valori entro l'anno.
brodrigues

1
@cbrunos Per favore, potresti fornire un esempio in cui questo non funziona? (Ma puoi regolare il convert_to_yearper affrontarlo) ... Sono d'accordo che sarebbe un nome più appropriato df['Year'].
Andy Hayden,

1
@cbrunos Questo dovrebbe funzionare bene per voi: for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year).
Andy Hayden,

In questi giorni faccio spesso cose del genere df["Date"].str[-4:].astype(int).
DSM

1
@dmvianna o forses.str.extract('(?P<year>\d{4})')
Andy Hayden

29

È possibile eseguire una trasformazione di colonna utilizzando apply

Definisci una funzione pulita per rimuovere il dollaro e le virgole e convertire i tuoi dati in virgola mobile.

def clean(x):
    x = x.replace("$", "").replace(",", "").replace(" ", "")
    return float(x)

Quindi, chiamalo sulla tua colonna in questo modo.

data['Revenue'] = data['Revenue'].apply(clean)

4

O se si desidera utilizzare la lambdafunzione nella applyfunzione:

data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.