2012-09-26 38 views
35

Tengo un marco de datos con una columna llamada "Date" y quiero que todos los valores de esta columna tengan el mismo valor (solo el año). Ejemplo:pandas: cómo cambiar todos los valores de una columna?

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

Lo que quiero es:

City  Date 
Paris 2004 
Lisbon 2004 
Madrid 2004 
Pekin 2004 

Aquí está mi código:

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

Sucede que en mis tramas de datos, llamados por ejemplo fr['1961'] los valores de Date_of_incorporation puede ser cualquier cosa (cadenas, enteros, etc.), así que tal vez sería mejor borrar por completo esta columna y luego adjuntar otra columna con solo el año al DataFram es?

+1

¿Las fechas son solo cadenas? –

+0

Cadenas y números dependiendo de si solo existe el año (como en el ejemplo de Madrid) o si también está el mes y el día (como Pekín y París). – brodrigues

Respuesta

62

Como @DSM señala, puede hacerlo de forma más directa con el vectorised string methods:

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

O usar el extracto (suponiendo que no es sólo un conjunto de dígitos de longitud 4 en algún lugar de cada cadena):

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

Una alternativa un poco más flexible manera, podría ser utilizar apply (o equivalentemente map) para hacer esto:

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

La función lambda, está tomando la entrada del Date y la convierte en un año.
Se podría (y tal vez debería) escribe esto más extensamente del como:

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) 

Tal vez 'Año' es un mejor nombre para esta columna ...

+0

Gracias por la respuesta, pero es más complicado que eso: a veces los valores son algo completamente distinto (como los caracteres). Creo que sería más sencillo descartar completamente esta columna, y luego agregar una nueva con el año, o reemplazar por completo los valores por año. – brodrigues

+0

@cbrunos ¿Podría darnos un ejemplo donde esto no funciona? (Pero puede ajustar el 'convert_to_year' para manejarlo) ... Acepto que un nombre más apropiado sería' df ['Year'] '. –

+0

Agregué mi código y más precisiones en el PO. – brodrigues

1

Usted puede hacer una transformación mediante el uso de la columna apply

Defina una función de limpieza para eliminar el dólar y las comas y convierta sus datos a flotación.

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

A continuación, llámalo en tu columna como este.

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