具有两个索引的数据帧切片

Dataframe slicing with two indices

我得到了以下数据框,df,以 report_date 作为索引:

report_date sales
2021-06-30 130000
2021-06-30 140000
2021-07-31 125000
2021-07-31 110000
2021-08-31 110000
2021-08-31 110000

而且我只想提取 2021-06 和 2021-08。我怎样才能实现这个目标?

我可以通过 df['2021-06']df['2021-08']

提取两个单独的数据帧

随心所欲

df = df.reset_index()
new_df = df[(df["report_date"] == "2021-06") | (df["report_date"] == "2021-07")]

或使用numpy

new_df = df.iloc[np.where((df.index == "2021-06") | (df.index == "2021-07"))[0], :]

输出-

report_date sales
0 2021-06 130000
1 2021-06 140000
2 2021-07 125000
3 2021-07 110000

对于匹配值,可以将 DatetimeIndex 转换为月份,并通过 Index.isin:

测试成员资格
#if necessary
#df.index = pd.to_datetime(df.index)

df3 = df[df.index.to_period('m').isin(pd.to_datetime(['2021-06','2021-08']).to_period('m'))]
print (df3)
              sales
report_date        
2021-06-30   130000
2021-06-30   140000
2021-08-31   110000
2021-08-31   110000

或:

df3 = df[df.index.to_period('m').isin(pd.PeriodIndex(['2021-06','2021-08'], freq='m'))]
print (df3)
              sales
report_date        
2021-06-30   130000
2021-06-30   140000
2021-08-31   110000
2021-08-31   110000

或将值转换为字符串 YYYY-MM 并按列表中的字符串进行测试:

df3 = df[df.index.strftime('%Y-%m').isin(['2021-06','2021-08'])]
print (df3)
              sales
report_date        
2021-06-30   130000
2021-06-30   140000
2021-08-31   110000
2021-08-31   110000