python - replacing - Pandas: ¿cómo cambiar todos los valores de una columna?
replace values dataframe column pandas (2)
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:
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''])
Ocurre que en mis DataFrames, llamado por ejemplo fr[''1961'']
los valores de Date_of_incorporation
pueden ser cualquier cosa (cadenas, enteros, etc.), así que tal vez sería mejor borrar completamente esta columna y luego adjuntar otra columna con solo el año para los DataFrames?
Como señala @DSM, puedes hacer esto de forma más directa usando los métodos de cadenas vectorizadas :
df[''Date''].str[-4:].astype(int)
O usando extracto (suponiendo que solo hay 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 manera alternativa un poco más flexible, podría ser usar apply
(o map
equivalente) 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 de la Date
y convirtiéndola en un año.
Podrías (y tal vez deberías) escribir esto más detalladamente 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)
Quizás ''Year'' sea un mejor nombre para esta columna ...
Puede hacer una transformación de columna mediante el uso de 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)
Luego, llámalo en tu columna de esta manera.
data[''Revenue''] = data[''Revenue''].apply(clean)