[英]Selecting the 2nd MultiIndex Level of Pandas DataFrame as an Indexer
我有一個帶有多索引的 Pandas DataFrame,我想在其中選擇上午 11 點到下午 1 點之間的所有行。
import pandas as pd
data = [
('Jack', '2020-01-01 10:00:00', 12),
('Jack', '2020-01-01 11:00:00', 13),
('Jack', '2020-01-01 12:00:00', 14),
('Jack', '2020-01-01 13:00:00', 15),
('Jack', '2020-01-01 14:00:00', 16),
('Ryan', '2020-01-01 10:00:00', 34),
('Ryan', '2020-01-01 11:00:00', 35),
('Ryan', '2020-01-01 12:00:00', 36),
('Ryan', '2020-01-01 13:00:00', 37),
('Ryan', '2020-01-01 14:00:00', 38),
]
df = pd.DataFrame(data, columns=['name', 'datetime', 'score']).set_index(['name','datetime'])
# score
# name datetime
# Jack 2020-01-01 10:00:00 12
# 2020-01-01 11:00:00 13
# 2020-01-01 12:00:00 14
# 2020-01-01 13:00:00 15
# 2020-01-01 14:00:00 16
# Ryan 2020-01-01 10:00:00 34
# 2020-01-01 11:00:00 35
# 2020-01-01 12:00:00 36
# 2020-01-01 13:00:00 37
# 2020-01-01 14:00:00 38
我當前的解決方案需要將所有多索引轉換為常規列,將datetime
列轉換為索引器,然后用於選擇所需的行。 然后重建多索引。
df = df.reset_index()
indexer = pd.DatetimeIndex(df['datetime'])
df = df.loc[indexer.indexer_between_time('11:00', '13:00')].set_index(['name', 'datetime'])
# score
# name datetime
# Jack 2020-01-01 11:00:00 13
# 2020-01-01 12:00:00 14
# 2020-01-01 13:00:00 15
# Ryan 2020-01-01 11:00:00 35
# 2020-01-01 12:00:00 36
# 2020-01-01 13:00:00 37
問題:是否可以直接使用reset_index
的第二級作為索引器,從而避免必須reset_index
和set_index
?
或者是否有更好的方法來實現在 2 個不同時間之間過濾行?
我正在使用 Python 3.7.4 和 Pandas 0.25.1。 如果有更好的解決方案,願意升級到新版本
您可以直接將索引與get_level_values
和pd.IndexSlice
:
indexer = (pd.DatetimeIndex(df.index.get_level_values('datetime'))
.indexer_between_time('11:00', '13:00'))
df.loc[pd.IndexSlice[:, df.index.get_level_values('datetime')[indexer]], :]
score
name datetime
Jack 2020-01-01 11:00:00 13
2020-01-01 12:00:00 14
2020-01-01 13:00:00 15
Ryan 2020-01-01 11:00:00 35
2020-01-01 12:00:00 36
2020-01-01 13:00:00 37
df.loc[(slice(None),slice('2020-01-01 11:00:00','2020-01-01 13:00:00')),:]
輸出:
score
name datetime
Jack 2020-01-01 11:00:00 13
2020-01-01 12:00:00 14
2020-01-01 13:00:00 15
Ryan 2020-01-01 11:00:00 35
2020-01-01 12:00:00 36
2020-01-01 13:00:00 37
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.