熊猫:如何更改列的所有值?


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
字符串和数字取决于是否只有年份(如本例中的马德里)或是否还有月和日(如Pekin和Paris)。
brodrigues 2012年

Answers:


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

lambda函数从中获取输入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)

在本专栏中,“ Year”也许是个更好的名字...


1
谢谢您的回答,但要复杂得多:有时值完全是别的东西(例如字符)。我认为,完全删除此列,然后在年份中添加一个新列,或者用年份完全替换值,会更简单。
brodrigues 2012年

1
@cbrunos请提供一个不起作用的示例吗?(但是您可以调整convert_to_year来应对)...我同意一个更合适的名称是df['Year']
安迪·海登

1
@cbrunos这应该工作的罚款给你:for year in fr: df=fr[year]; df['Year_of_incorporation']=df['Date_of_incorporation'].map(convert_to_year)
安迪·海登

这些天我经常做类似的事情df["Date"].str[-4:].astype(int)
DSM 2014年

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(" ", "")))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.