问题描述
我有一个带有称为"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'])
发生在我的数据框中,例如fr['1961'] Date_of_incorporation的值可以是任何东西(字符串,整数等),因此,最好是完全删除此列和然后将另一列仅与一年相连到数据范围?
推荐答案
@dsm指出,您可以使用矢量化字符串方法:
df['Date'].str[-4:].astype(int)
或使用提取物(假设每个字符串中只有一组长度4的数字):
df['Date'].str.extract('(?P<year>\d{4})').astype(int)
另一种更灵活的方法,可能是使用 apply (或等效地 )做到这一点:
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) # 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)
也许'年'是此列的更好名称...
其他推荐答案
您可以使用apply
进行列转换定义一个干净的功能以删除美元和逗号并将您的数据转换为float.
def clean(x): x = x.replace("$", "").replace(",", "").replace(" ", "") return float(x)
接下来,像这样在您的专栏上调用它.
data['Revenue'] = data['Revenue'].apply(clean)
其他推荐答案
或者是否要在apply函数中使用lambda函数:
data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))
问题描述
I have a data frame with a column called "Date" and want all the values from this column to have the same value (the year only). Example:
City Date Paris 01/04/2004 Lisbon 01/09/2004 Madrid 2004 Pekin 31/2004
What I want is:
City Date Paris 2004 Lisbon 2004 Madrid 2004 Pekin 2004
Here is my code:
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'])
It happens that in my DataFrames, called for example fr['1961'] the values of Date_of_incorporation can be anything (strings, integer, and so on), so maybe it would be best to completely erase this column and then attach another column with only the year to the DataFrames?
推荐答案
As @DSM points out, you can do this more directly using the vectorised string methods:
df['Date'].str[-4:].astype(int)
Or using extract (assuming there is only one set of digits of length 4 somewhere in each string):
df['Date'].str.extract('(?P<year>\d{4})').astype(int)
An alternative slightly more flexible way, might be to use apply (or equivalently map) to do this:
df['Date'] = df['Date'].apply(lambda x: int(str(x)[-4:])) # converts the last 4 characters of the string to an integer
The lambda function, is taking the input from the Date and converting it to a year.
You could (and perhaps should) write this more verbosely as:
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)
Perhaps 'Year' is a better name for this column...
其他推荐答案
You can do a column transformation by using apply
Define a clean function to remove the dollar and commas and convert your data to float.
def clean(x): x = x.replace("$", "").replace(",", "").replace(" ", "") return float(x)
Next, call it on your column like this.
data['Revenue'] = data['Revenue'].apply(clean)
其他推荐答案
Or if one want to use lambda function in the apply function:
data['Revenue']=data['Revenue'].apply(lambda x:float(x.replace("$","").replace(",", "").replace(" ", "")))