Python 基于多列提取值
我想根据数据框中名为“signed”和“period”的列映射值。我的规则基于“期间”列Python 基于多列提取值,python,function,dictionary,Python,Function,Dictionary,我想根据数据框中名为“signed”和“period”的列映射值。我的规则基于“期间”列 如果值包含月份和季度,我希望返回它们所在的日期 如果值包含冬季或夏季,我还希望返回它们的秋季日期,但夏季是四月,冬季是十月 对于其他内容,我希望在名为“已签名”的列中返回日期 我想根据我的输出数据插入4个新列 I have input data: period signed May-20 16/05/2020 August-20
- 如果值包含月份和季度,我希望返回它们所在的日期
- 如果值包含冬季或夏季,我还希望返回它们的秋季日期,但夏季是四月,冬季是十月
- 对于其他内容,我希望在名为“已签名”的列中返回日期
I have input data:
period signed
May-20 16/05/2020
August-20 10/05/2020
Q2-20 14/05/2020
Q3-20 21/05/2020
10/05/2020 11/05/2020
Summer 21 18/05/2020
Winter 22 19/05/2020
Weekend 20/05/2020
week 15-20 21/05/2020
我想要这个输出
period signed day month quarter year
May-20 16/05/2020 1 5 2 2020
August-20 10/05/2020 1 8 3 2020
Q2-20 14/05/2020 1 4 2 2020
Q3-21 21/05/2020 1 7 3 2021
10/05/2020 11/05/2020 10 5 2 2020
Summer 21 18/05/2020 1 4 2 2021
Winter 22 19/05/2020 1 10 4 2022
Weekend 20/05/2020 20 5 2 2020
week 15-20 21/05/2020 21 5 2 2020
这是我试图实现的代码,但它只返回“signed”中的值,这不符合我的规则
datemap = { 'January' : {'day' : 1, 'month' : 1, 'quarter' : 1},
'February' : {'day' : 1, 'month' : 2, 'quarter' : 1},
'March' : {'day' : 1, 'month' : 3, 'quarter' : 1},
# and so on ...
'Spring' : {'day' : 1, 'month' : 1, 'quarter' : 1},
'Summer' : {'day' : 1, 'month' : 4, 'quarter' : 2},
'Fall' : {'day' : 1, 'month' : 7, 'quarter' : 3},
'Winter' : {'day' : 1, 'month' : 10, 'quarter' : 4},
'Q1' : {'day' : 1, 'month' : 1, 'quarter' : 1},
'Q2' : {'day' : 1, 'month' : 4, 'quarter' : 2},
'Q3' : {'day' : 1, 'month' : 7, 'quarter' : 3},
'Q4' : {'day' : 1, 'month' : 10, 'quarter' : 4},
'Year' : {'day' : 1, 'month' : 1, 'quarter' : 1} }
import calendar
def get_datemap_data(row,key,key_datemap):
try:
if key_datemap == "year":
if key in datemap:
return row['period'].split()[1][-2:]
else:
raise ValueError
else:
return datemap[key][key_datemap]
except KeyError:
signed_split = row["signed"].split("/")
map_to_signed = {"day":0,"month":1}
if key_datemap == "quarter":
return datemap[calendar.month_name[int(signed_split[1])]]["quarter"]
return int(signed_split[map_to_signed[key_datemap]])
except ValueError:
signed_split = row["signed"].split("/")
return signed_split[2]
df['day'] = df.apply (lambda r: get_datemap_data(r,r['period'].split()[0],'day'), axis=1)
df['month'] = df.apply (lambda r: get_datemap_data(r,r['period'].split()[0],'month'), axis=1)
df['quarter'] = df.apply (lambda r: get_datemap_data(r,r['period'].split()[0],'quarter'), axis=1)
df['year'] = df.apply (lambda r: "20" + get_datemap_data(r,r['period'].split()[0],'year'), axis=1)
1.
datemap
没有像10/05/2020
这样的键,您可以使用signed
列来处理键错误,该列的值为11/05/2020
。2. r['period'].split()[0]
仅对包含空格的值有效,如果将May-20
更改为May-20
则有效。3. <代码>lambda r:“20”+…该“20”+
仅与某些行相关,请将其插入函数中的正确位置,而不是将其添加到每个结果中。试着调试你的代码,看看哪里失败了,你的错误很小,但也不少。提示:如果它返回带符号的值,您可能会得到ValueError
s。谢谢。2. r['period'].split()[0]
修复了我的问题。1datemap
没有像10/05/2020
这样的键,您可以使用signed
列来处理键错误,该列的值为11/05/2020
。2. r['period'].split()[0]
仅对包含空格的值有效,如果将May-20
更改为May-20
则有效。3. <代码>lambda r:“20”+…
该“20”+
仅与某些行相关,请将其插入函数中的正确位置,而不是将其添加到每个结果中。试着调试你的代码,看看哪里失败了,你的错误很小,但也不少。提示:如果它返回带符号的值,您可能会得到ValueError
s。谢谢。2. <代码>r['period'].split()[0]
修复了我的问题。