亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用來自單獨部分 MultiIndex 的條目從 pandas DataFrame 中選擇行的子集

使用來自單獨部分 MultiIndex 的條目從 pandas DataFrame 中選擇行的子集

精慕HU 2022-09-06 15:38:13
我在熊貓數據幀中有一個帶有MultiIndex的數據。讓我們將我的 MultiIndex 的標簽稱為“運行”、“觸發器”和“群集”。另外,我有一個預先計算的選擇標準列表,我得到的是一個通過的條目列表(這些往往是稀疏的,因此列出傳遞的索引是最節省空間的)。選擇剪切只能部分索引,例如,只能指定“運行”或(“運行”,“觸發器”)對。如何有效地應用這些切口,理想情況下,無需檢查它們以找到它們的水平?例如,請考慮以下數據:index = pandas.MultiIndex.from_product([[0,1,2],[0,1,2],[0,1]], names=['Run','Trigger','Cluster'])df = pandas.DataFrame(np.random.rand(len(index),3), index=index, columns=['a','b','c'])print(df)                            a         b         cRun Trigger Cluster                              0   0       0        0.789090  0.776966  0.764152            1        0.196648  0.635954  0.479195    1       0        0.007268  0.675339  0.966958            1        0.055030  0.794982  0.660357    2       0        0.987798  0.907868  0.583545            1        0.114886  0.839434  0.0707301   0       0        0.520827  0.626102  0.088976            1        0.377423  0.934224  0.404226    1       0        0.081669  0.485830  0.442296            1        0.620439  0.537927  0.406362    2       0        0.155784  0.243656  0.830895            1        0.734176  0.997579  0.2262722   0       0        0.867951  0.353823  0.541483            1        0.615694  0.202370  0.229423    1       0        0.912423  0.239199  0.406443            1        0.188609  0.053396  0.222914    2       0        0.698515  0.493518  0.201951            1        0.415195  0.975365  0.687365選擇標準可以采取以下任何形式:set1:Int64Index([0], dtype='int64', name='Run')set2:MultiIndex([(0, 1),            (1, 2)],           names=['Run', 'Trigger'])set3:MultiIndex([(0, 0, 1),            (1, 0, 1),            (2, 1, 0)],           names=['Run', 'Trigger', 'Cluster'])pandas可以很容易地加入這些類型的混合級別索引,所以看起來這應該是一個簡單的操作,但我無法弄清楚寫入調用。 適用于 set3,因為索引的深度相同,但我需要一個通用的解決方案。loc
查看完整描述

2 回答

?
白板的微信

TA貢獻1883條經驗 獲得超3個贊

df.loc[set3]工作,因為具有索引的所有3個級別。您可以模擬此行為,并將缺少的級別替換為 :set3set1set2slicer(None)


def select(df, index):

    slicer = []

    for name in df.index.names:

        if name in index.names:

            values = index.get_level_values(name).values

        else:

            values = slice(None)

        slicer.append(values)


    return df.loc[tuple(slicer), :]

然后,您可以使用:


select(df, set1)

select(df, set2)

select(df, set3)

如果您希望它作為數據幀上的方法:


pd.DataFrame.select = select

df.select(set1) # etc.

請注意,這將忽略 在 中不存在的級別:indexdf.index


# there's no level "FooBar" in df

set4 = pd.MultiIndex.from_tuples([(0, 42)], names=['Trigger', 'FooBar'])

df.select(set4) # works just fine

我還沒有測試性能,如果你在一個緊密的循環中這樣做,可能不會太快。


查看完整回答
反對 回復 2022-09-06
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

使用純熊貓實現此目的的一種方法是:

df.align(setN.to_series(), axis=0, join='inner')[0]

也就是說,將“其他”索引轉換為 Series,并選擇在內部連接操作期間將保留的每個索引的部分。


查看完整回答
反對 回復 2022-09-06
  • 2 回答
  • 0 關注
  • 165 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號