Pandas: як змінити всі значення стовпця?


87

У мене є кадр даних із стовпчиком, який називається, "Date"і хочу, щоб усі значення з цього стовпця мали однакове значення (лише рік). Приклад:

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

Я хочу:

City     Date
Paris    2004
Lisbon   2004
Madrid   2004
Pekin    2004

Ось мій код:

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

Трапляється, що в моїх DataFrames, які називаються, наприклад, fr['1961']значеннями Date_of_incorporationможе бути будь-що (рядки, ціле число тощо), тож, можливо, було б найкраще повністю стерти цей стовпець, а потім приєднати до DataFrames ще один стовпець із лише роком?


1
Рядки та числа залежно від того, чи є лише рік (наприклад, для Мадрида у прикладі), чи є також місяць і день (як для Пекіна та Парижа).
brodrigues

Відповіді:


128

Як вказує @DSM, ви можете зробити це більш безпосередньо, використовуючи векторизовані рядкові методи :

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

Або за допомогою витяжки (припускаючи, що десь у кожному рядку є лише один набір цифр довжиною 4):

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

Альтернативним, дещо гнучкішим способом може бути використання apply(або еквівалентmap ) для цього:

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

Ламбда-функція приймає вхідні дані з Dateі перетворює їх на рік.
Ви можете (і, можливо, слід) написати це більш детально, як:

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)

Можливо, "Рік" - краща назва для цієї колонки ...


1
Дякую за відповідь, але це складніше, ніж це: іноді значення - це зовсім інше (наприклад, символи). Думаю, простіше буде повністю скинути цей стовпець, а потім додати новий із роком або повністю замінити значення за роком.
brodrigues

1
@cbrunos Будь ласка, можете навести приклад, коли це не працює? (Але ви можете налаштувати, convert_to_yearщоб розібратися з цим) ... Я згоден, що було б більш відповідним ім'ям df['Year'].
Andy Hayden,

1
@cbrunos Це повинно працювати нормально для вас: for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year).
Andy Hayden

У наші дні я часто роблю такі речі df["Date"].str[-4:].astype(int).
DSM

1
@dmvianna або можливоs.str.extract('(?P<year>\d{4})')
Andy Hayden

29

Ви можете зробити перетворення стовпців за допомогою apply

Визначте чисту функцію для видалення долара та коми та перетворення даних у плаваючі.

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

Далі, назвіть це у своїй колонці так.

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

3

Або якщо ви хочете використовувати lambdaфункцію у applyфункції:

data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.