Python 基于多列提取值

Python 基于多列提取值,python,function,dictionary,Python,Function,Dictionary,我想根据数据框中名为“signed”和“period”的列映射值。我的规则基于“期间”列 如果值包含月份和季度,我希望返回它们所在的日期 如果值包含冬季或夏季,我还希望返回它们的秋季日期,但夏季是四月,冬季是十月 对于其他内容,我希望在名为“已签名”的列中返回日期 我想根据我的输出数据插入4个新列 I have input data: period signed May-20 16/05/2020 August-20

我想根据数据框中名为“signed”和“period”的列映射值。我的规则基于“期间”列

  • 如果值包含月份和季度,我希望返回它们所在的日期
  • 如果值包含冬季或夏季,我还希望返回它们的秋季日期,但夏季是四月,冬季是十月
  • 对于其他内容,我希望在名为“已签名”的列中返回日期
我想根据我的输出数据插入4个新列

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]
修复了我的问题。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]
修复了我的问题。