Pandas 在索引中的日期上创建另一列条件

Pandas 在索引中的日期上创建另一列条件,pandas,multi-index,Pandas,Multi Index,我有一个多索引数据框,其中一个索引基于日期。 我的数据框如下所示: Value Date Category 1980-12-31 Cat 100 Dog 150 Bat 200 1981-12-31 Cat 100 Dog 150 Bat 200 1982-12-31 Cat

我有一个多索引数据框,其中一个索引基于日期。 我的数据框如下所示:

                     Value
Date       Category 
1980-12-31   Cat     100
             Dog     150
             Bat     200
1981-12-31   Cat     100
             Dog     150
             Bat     200
1982-12-31   Cat     100
             Dog     150
             Bat     200
作为参考,索引中的日期格式为

df['Date'] = pd.to_datetime(df['Date'], format='%b-%Y') + MonthEnd(0)
虽然输出看起来与我预期的不同,但我认为它应该作为mmm而不是数字来完成

我想添加另一列,比如'Value_2',它是以索引中的日期值为条件的。 例如,如果它在1980年到1981年之间,我想要一个0.1的值;如果小于1982,我想要0.2;如果大于1982,我想返回0.5

我试过使用

Early = df.loc['Date'] <= '1980-12-31'
Mid =  df.loc['Date'] > '1980-12-31' & df.loc['Date'] <= '1981-12-31'
Late = df.loc['Date'] > '1981-12-31' & df.loc['Date'] <= '1982-12-31'
df['Value_2'] = np.where(Early, 0.1, np.where(Mid, 0.2, 0.5)

Early=df.loc['Date']'1980-12-31'和df.loc['Date']'1981-12-31'&df.loc['Date']
Date
是索引级别的名称,而不是索引本身的位置。你不能做
df.loc['Date']
,我想你需要
df[:'1980-12-31']
等等。例如:

df[:'1980-12-31']
给出:

                     Value
Date       Category       
1980-12-31 Cat           0
           Dog           1
           Bat           2
在您的情况下,
cut
将是一个更好的选择:

df['Value_2'] = pd.cut(df.index.get_level_values('Date'), 
           pd.to_datetime(['1980-12-31','1981-12-31','1982-12-31', '2020-12-31']),
           include_lowest=True,
           labels=[0.1,0.2,0.5])
输出:

                     Value Value_2
Date       Category               
1980-12-31 Cat           0     0.1
           Dog           1     0.1
           Bat           2     0.1
1981-12-31 Cat           3     0.1
           Dog           4     0.1
           Bat           5     0.1
1982-12-31 Cat           6     0.2
           Dog           7     0.2
           Bat           8     0.2

非常感谢。请再来一次。“Value_2”中我想要的值会有相当多的复杂性。例如,在我显示的日期之间会有其他日期…例如1981年6月15日需要显示为0.2的值。请问,有没有一种方法可以合并这些内容?同样,您可能希望将
right=False
传递给
pd.cut
。这非常有用。非常感谢。