具有两个索引的数据帧切片
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
我得到了以下数据框,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