簡體   English   中英

在 Pandas 多索引中逐級迭代

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM