[英]Iterate by level in Pandas multi-index
本質上,我有一個多索引,它是第一個日期時間,然后是周數的 integer 值。
我想 select 一個周數,檢查該周數據的一些條件,如果滿足這些條件,則獲取索引的日期時間級別。
這是一個簡化版本:
# Dataframe creation
index = pd.date_range('1/1/2019', '1/4/2019')
df = pd.DataFrame({'A': [1, 2, 3, 4], 'B':[3, 4, 5, 6], 'C':['a', 'a', 'b', 'b']}, index=index)
print(df)
A B C
2019-01-01 1 3 a
2019-01-02 2 4 a
2019-01-03 3 5 b
2019-01-04 4 6 b
然后,
# make a multi-index with last column
df = df.set_index([df.index, 'C'])
print(df)
A B
C
2019-01-01 a 1 3
2019-01-02 a 2 4
2019-01-03 b 3 5
2019-01-04 b 4 6
再次,很好。 根據這個答案,我希望df.loc[['a']]
會產生
A B
C
2019-01-01 a 1 3
2019-01-02 a 2 4
但是,我得到一個鍵/索引錯誤。 我改為嘗試df[df['C'] == 'a']
,但也出現了鍵/索引錯誤。
所以我想要實現的偽代碼類似於:
df = df.set_index([df.index, 'C'])
for value in 'C' level:
check some condition on 'B' variable.
if condition:
get date level for this value
如果我能弄清楚如何按指定的索引級別進行切片,這似乎相當簡單......我錯過了什么?
筆記:
我意識到我可以將C
變量保留為一列,然后執行以下操作:
for c in df.C.unique():
if (df[df.C == c].B >= 4).any():
dates = df[df.C == c].index
print(dates)
但是,現在我專注於理解多索引只是為了更好地學習 Pandas。
快速修復: query
適用於級別名稱:
df.query('C=="a"')
Output:
A B
C
2019-01-01 a 1 3
2019-01-02 a 2 4
官方文檔中有關多級索引的更多詳細信息。 如果您有多級索引,則按元組(first_level, second_level)
對其進行切片:
df.loc[('2019/01/01', 'a')]
因此,您可以獲得具有二級值的所有行:
df.loc[(slice(None), 'a'), :]
你得到:
A B
C
2019-01-01 a 1 3
2019-01-02 a 2 4
或者您可以使用xs
:
df.xs('a', level='C')
其中給出(請注意,二級索引已消失):
A B
2019-01-01 1 3
2019-01-02 2 4
最后,您要for c in df.C.unique():
做的更多是groupby
:
df.loc[df.groupby('C')['B'].transform('max')>=4].index
Output:
MultiIndex([('2019-01-01', 'a'),
('2019-01-02', 'a'),
('2019-01-03', 'b'),
('2019-01-04', 'b')],
names=[None, 'C'])
我想你想要的是:
df.loc[(slice(None), 'a'), :]
這會給你:
A B
C
2019-01-01 a 1 3
2019-01-02 a 2 4
這是基於對問題Select 行中 pandas MultiIndex DataFrame 行的問題 1b的回答。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.