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
。这非常有用。非常感谢。