第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

在熊貓多索引DataFrame中選擇行

在熊貓多索引DataFrame中選擇行

明月笑刀無情 2019-07-13 10:16:23
在熊貓多索引DataFrame中選擇行目標與動機這個MultiIndexAPI多年來越來越流行,但是,并不是所有關(guān)于它的東西都是從結(jié)構(gòu)、工作和相關(guān)操作的角度被完全理解的。一個重要的操作是過濾..過濾是一個常見的需求,但是用例是多種多樣的。因此,某些方法和功能將比其他方法和功能更適用于某些用例。總之,這篇文章的目的是探討一些常見的過濾問題和用例,演示解決這些問題的各種不同方法,并討論它們的適用性。這篇文章試圖解決的一些高級問題是:基于單個值/標簽的切片基于一個或多個級別的多個標簽的切片布爾條件和表達式的過濾哪種方法在什么情況下適用?這些問題已細分為以下6個具體問題。為了簡單起見,下面設(shè)置中的示例DataFrames只有兩個級別,并且沒有重復(fù)的索引鍵。大多數(shù)問題的解決方案都可以推廣到N級。這個職位不了解如何創(chuàng)建多索引、如何對它們執(zhí)行賦值操作或任何與性能相關(guān)的討論(這些是另一次單獨的主題)。問題問題1-6將在以下設(shè)置的上下文中被問到.mux = pd.MultiIndex.from_arrays([     list('aaaabbbbbccddddd'),     list('tuvwtuvwtuvwtuvw')], names=['one', 'two'])df = pd.DataFrame({'col': np.arange(len(mux))}, mux)          col one two      a   t      0     u      1     v      2     w      3b   t      4     u      5     v      6     w      7     t      8c   u      9     v     10d   w     11     t     12     u     13     v     14     w     15問題1:選擇單個項目如何選擇在“一級”中具有“a”的行?         col one two      a   t      0     u      1     v      2     w      3此外,我怎樣才能降低輸出中的“一”級呢?     col two      t      0u      1v      2w      3問題1b如何將值為“t”的所有行分割為“二級”?         col one two      a   t      0b   t      4     t      8d   t     12問題2:在級別中選擇多個值如何選擇與“一級”中的“b”和“d”項對應(yīng)的行?         col one two      b   t      4     u      5     v      6     w      7     t      8d   w     11     t     12     u     13     v     14     w     15問題2b如何得到“二級”中與“t”和“w”對應(yīng)的所有值?         col one two      a   t      0     w      3b   t      4     w      7     t      8d   w     11     t     12     w     15問題3:切割單個截面(x, y)如何檢索橫截面,即具有索引的特定值的單個行df?具體而言,如何檢索('c', 'u'),由         col one two      c   u      9問題4:多截面切片[(a, b), (c, d), ...]如何選擇與('c', 'u'),和('a', 'w')?         col one two      c   u      9a   w      3問題5:每級切片一項如何檢索與“一級”中的“a”或“二級”中的“t”對應(yīng)的所有行?         col one two      a   t      0     u      1     v      2     w      3b   t      4     t      8d   t     12問題6:任意切片如何分割特定的截面?對于“a”和“b”,我想選擇所有具有子級別“u”和“v”的行,對于“d”,我想選擇具有子級別“w”的行。         col one two      a   u      1     v      2b   u      5     v      6d   w     11     w     15
查看完整描述

1 回答

?
Qyouu

TA貢獻1786條經(jīng)驗 獲得超11個贊

多重索引/高級索引


該員額的結(jié)構(gòu)如下:

  1. 執(zhí)行部分中提出的問題將一個接一個地加以解決。
  2. 對于每個問題,將演示一個或多個用于解決該問題并獲得預(yù)期結(jié)果的方法。

對于有興趣了解更多功能、實現(xiàn)細節(jié)和其他相關(guān)信息的讀者,將包括S(與此類似)。這些注釋是通過瀏覽文檔和發(fā)現(xiàn)各種晦澀的特性,并根據(jù)我自己(無可否認是有限的)經(jīng)驗編寫的。

所有代碼示例都在熊貓v0.23.4,python3.7..如果某些事情不清楚,或者實際上不正確,或者如果您沒有找到適用于您的用例的解決方案,請隨時建議編輯,在評論中要求澄清,或在適用的情況下打開一個新的問題。

下面是一些常見習(xí)語的介紹(從此以后稱為四個習(xí)語),我們將經(jīng)常重訪。

  1. DataFrame.loc-標簽選擇的一般解決方案(+)pd.IndexSlice對于涉及片的更復(fù)雜的應(yīng)用程序)

  2. DataFrame.xs-從系列/DataFrame中提取特定的截面。

  3. DataFrame.query-動態(tài)指定切片和/或過濾操作(即,作為動態(tài)計算的表達式。比其他情況更適用于某些情況。亦見這部分文檔用于查詢多個索引。

  4. 使用MultiIndex.get_level_values(通常與Index.isin,特別是當(dāng)使用多個值進行篩選時)。在某些情況下,這也是相當(dāng)有用的。

從這四個成語的角度來考察各種切分和過濾問題,將有助于更好地理解在特定情況下可以應(yīng)用什么。非常重要的是要明白,并不是所有的成語在每一種情況下都能發(fā)揮同樣好的作用(如果有的話)。如果一個成語沒有被列為下面問題的潛在解決方案,那就意味著成語不能有效地應(yīng)用于這個問題。


問題1

如何選擇在“一級”中具有“a”的行?

         col
one two     
a   t      0
    u      1
    v      2
    w      3

你可以用loc,作為適用于大多數(shù)情況的一般目的解決辦法:

df.loc[['a']]

在這一點上,如果你

TypeError: Expected tuple, got str

這意味著你使用的是更老版本的熊貓??紤]升級!否則,使用df.loc[('a', slice(None)), :].

或者,您可以使用xs在這里,因為我們要提取一個橫截面。注意levelsaxis參數(shù)(這里可以假定合理的默認值)。

df.xs('a', level=0, axis=0, drop_level=False)# df.xs('a', drop_level=False)

在這里,drop_level=False需要用參數(shù)來防止xs從結(jié)果中刪除“一級”(我們切片的級別)。

這里的另一個選擇是使用query:

df.query("one == 'a'")

如果索引沒有名稱,則需要將查詢字符串更改為"ilevel_0 == 'a'".

最后,使用get_level_values:

df[df.index.get_level_values('one') == 'a']# If your levels are unnamed, or if you need to select by position (not label),# df[df.index.get_level_values(0) == 'a']

此外,我怎樣才能降低輸出中的“一”級呢?

     col
two     
t      0u      1v      2w      3

這可能是容易使用

df.loc['a'] # Notice the single string argument instead the list.

或,

df.xs('a', level=0, axis=0, drop_level=True)# df.xs('a')

注意,我們可以省略drop_level論點(假定為True(默認情況下)。


您可能會注意到,過濾后的DataFrame可能仍然具有所有級別,即使它們在打印出DataFrame時沒有顯示出來。例如,

v = df.loc[['a']]print(v)
         col
one two     
a   t      0
    u      1
    v      2
    w      3print(v.index)MultiIndex(levels=[['a', 'b', 'c', 'd'], ['t', 'u', 'v', 'w']],
           labels=[[0, 0, 0, 0], [0, 1, 2, 3]],
           names=['one', 'two'])

您可以使用MultiIndex.remove_unused_levels:

v.index = v.index.remove_unused_levels()print(v.index)MultiIndex(levels=[['a'], ['t', 'u', 'v', 'w']],
           labels=[[0, 0, 0, 0], [0, 1, 2, 3]],
           names=['one', 'two'])

問題1b

如何將值為“t”的所有行分割為“二級”?

         col
one two     
a   t      0b   t      4
    t      8d   t     12

直覺上,你會想要一些slice():

df.loc[(slice(None), 't'), :]

它只是起作用了!?,但是它很笨重。我們可以使用pd.IndexSliceAPI在這里。

idx = pd.IndexSlicedf.loc[idx[:, 't'], :]

這個要干凈得多。


為什么尾翼:縱橫交錯?這是因為loc可用于沿兩個軸(axis=0axis=1)。如果不明確說明要在哪個軸上進行切片,操作就變得模糊不清??吹侥莻€紅色的大盒子切片文件.

如果你想消除任何含糊不清的地方,loc接受axis參數(shù):

df.loc(axis=0)[pd.IndexSlice[:, 't']]

沒有axis參數(shù)(即,只需執(zhí)行df.loc[pd.IndexSlice[:, 't']]),切片被假定在列上,并且KeyError將在這種情況下提出。

這被記錄在切片機..然而,為了這篇文章的目的,我們將明確指定所有的軸。

帶著xs,是的

df.xs('t', axis=0, level=1, drop_level=False)

帶著query,是的

df.query("two == 't'")# Or, if the first level has no name, # df.query("ilevel_1 == 't'")

最后,用get_level_values,你可以

df[df.index.get_level_values('two') == 't']# Or, to perform selection by position/integer,# df[df.index.get_level_values(1) == 't']

結(jié)果都一樣。


問題2

如何選擇與“一級”中的“b”和“d”項對應(yīng)的行?

         col
one two     
b   t      4
    u      5
    v      6
    w      7
    t      8d   w     11
    t     12
    u     13
    v     14
    w     15

使用LOC,通過指定一個列表以類似的方式完成這一任務(wù)。

df.loc[['b', 'd']]

要解決上述選擇“b”和“d”的問題,還可以使用query:

items = ['b', 'd']df.query("one in @items")# df.query("one == @items", parser='pandas')# df.query("one in ['b', 'd']")# df.query("one == ['b', 'd']", parser='pandas')


是的,默認的解析器是'pandas'但是,強調(diào)這個語法并不是傳統(tǒng)的python,這一點很重要。Pandas解析器生成一個與表達式略有不同的解析樹。這樣做是為了使某些操作更直觀地指定。欲知更多信息,請閱讀我在熊貓動態(tài)表達評價的pd.val().

還有,和get_level_values + Index.isin:

df[df.index.get_level_values("one").isin(['b', 'd'])]

問題2b

如何得到“二級”中與“t”和“w”對應(yīng)的所有值?

         col
one two     
a   t      0
    w      3b   t      4
    w      7
    t      8d   w     11
    t     12
    w     15

帶著loc,這是可能的與.pd.IndexSlice.

df.loc[pd.IndexSlice[:, ['t', 'w']], :]

第一冒號:在……里面pd.IndexSlice[:, ['t', 'w']]意思是分出第一個層次。隨著被查詢級別深度的增加,您將需要指定更多的切片,每個級別都要切片一個。您不需要指定更多級別。超越然而,正在被切割的那個。

帶著query,這是

items = ['t', 'w']df.query("two in @items")# df.query("two == @items", parser='pandas') # df.query("two in ['t', 'w']")# df.query("two == ['t', 'w']", parser='pandas')

帶著get_level_valuesIndex.isin(與上文類似):

df[df.index.get_level_values('two').isin(['t', 'w'])]

問題3

如何檢索橫截面,即具有索引的特定值的單個行df?具體而言,如何檢索('c', 'u'),由

         col
one two     
c   u      9

使用loc通過指定鍵元組:

df.loc[('c', 'u'), :]

或,

df.loc[pd.IndexSlice[('c', 'u')]]


此時,您可能會遇到PerformanceWarning看起來是這樣的:

PerformanceWarning: indexing past lexsort depth may impact performance.

這只意味著索引沒有排序。熊貓取決于被排序的索引(在這種情況下,按字典順序,因為我們處理的是字符串值),以便進行最佳搜索和檢索。一個快速的解決方法是預(yù)先使用以下方法對DataFrame進行排序DataFrame.sort_index..如果您計劃同時執(zhí)行多個這樣的查詢,那么從性能的角度來看,這是特別可取的:

df_sort = df.sort_index()df_sort.loc[('c', 'u')]

您也可以使用MultiIndex.is_lexsorted()若要檢查索引是否已排序,請執(zhí)行以下操作。此函數(shù)返回TrueFalse因此。您可以調(diào)用此函數(shù)來確定是否需要額外的排序步驟。

帶著xs,這再次簡單地傳遞一個元組作為第一個參數(shù),所有其他參數(shù)都設(shè)置為相應(yīng)的默認值:

df.xs(('c', 'u'))

帶著query,事情變得有點笨重:

df.query("one == 'c' and two == 'u'")

你現(xiàn)在可以看到,這將是相對難以概括的。但是對于這個特殊的問題還是可以的。

訪問跨越多個層次,get_level_values仍然可以使用,但不建議:

m1 = (df.index.get_level_values('one') == 'c')m2 = (df.index.get_level_values('two') == 'u')df[m1 & m2]

問題4

如何選擇與('c', 'u'),和('a', 'w')?

         col
one two     
c   u      9a   w      3

帶著loc,這仍然很簡單:

df.loc[[('c', 'u'), ('a', 'w')]]# df.loc[pd.IndexSlice[[('c', 'u'), ('a', 'w')]]]

帶著query,您需要通過遍歷橫截面和級別來動態(tài)生成查詢字符串:

cses = [('c', 'u'), ('a', 'w')]levels = ['one', 'two']# This is a useful check to make in advance.assert all(len(levels) == len(cs) for cs in cses) query = '(' + ') or ('.join([
    ' and '.join([f"({l} == {repr(c)})" for l, c in zip(levels, cs)]) 
    for cs in cses]) + ')'print(query)# ((one == 'c') and (two == 'u')) or ((one == 'a') and (two == 'w'))df.query(query)

100%不推薦!但這是有可能的。


問題5

如何檢索與“一級”中的“a”或“二級”中的“t”對應(yīng)的所有行?

         col
one two     
a   t      0
    u      1
    v      2
    w      3b   t      4
    t      8d   t     12

這實際上是很難做到的。loc同時確保正確性仍然保持代碼清晰。df.loc[pd.IndexSlice['a', 't']]是不正確的,它被解釋為df.loc[pd.IndexSlice[('a', 't')]](即選擇橫截面)。你可能會想到一個解決方案pd.concat若要單獨處理每個標簽:

pd.concat([
    df.loc[['a'],:], df.loc[pd.IndexSlice[:, 't'],:]])

         col
one two     
a   t      0
    u      1
    v      2
    w      3
    t      0   # Does this look right to you? No, it isn't!b   t      4
    t      8d   t     12

但是你會注意到其中一行是重復(fù)的。這是因為該行既滿足了切片條件,又出現(xiàn)了兩次。你需要做的是

v = pd.concat([
        df.loc[['a'],:], df.loc[pd.IndexSlice[:, 't'],:]])v[~v.index.duplicated()]

但是,如果您的DataFrame固有地包含重復(fù)的索引(您想要的),那么這將不會保留它們。極為謹慎地使用.

帶著query,這是愚蠢的簡單:

df.query("one == 'a' or two == 't'")

帶著get_level_values,這仍然很簡單,但沒有那么優(yōu)雅:

m1 = (df.index.get_level_values('one') == 'c')m2 = (df.index.get_level_values('two') == 'u')df[m1 | m2]

問題6

如何分割特定的截面?對于“a”和“b”,我想選擇所有具有子級別“u”和“v”的行,對于“d”,我想選擇具有子級別“w”的行。

         col
one two     
a   u      1
    v      2b   u      5
    v      6d   w     11
    w     15

這是我添加的一個特例,以幫助理解這四種成語的適用性-這是這樣一種情況,在這種情況下,它們都不能有效地工作,因為切片是非常具體而言,并不遵循任何真實的模式。

通常,像這樣的切片問題需要顯式地將鍵列表傳遞給loc..這樣做的一種方法是:

keys = [('a', 'u'), ('a', 'v'), ('b', 'u'), ('b', 'v'), ('d', 'w')]df.loc[keys, :]

如果您想保存一些類型,您將認識到對“a”、“b”及其子級別進行切片是有模式的,因此我們可以將切片任務(wù)分為兩部分,concat結(jié)果:

pd.concat([
     df.loc[(('a', 'b'), ('u', 'v')), :], 
     df.loc[('d', 'w'), :]
   ], axis=0)

“a”和“b”切片規(guī)范稍微干凈一些(('a', 'b'), ('u', 'v'))因為被索引的子級別對于每個級別都是相同的。


問題7

如何獲得級別“2”中的值大于5的所有行?

         col
one two     
b   7      4
    9      5c   7     10d   6     11
    8     12
    8     13
    6     15

這可以使用query,

df2.query("two > 5")

get_level_values.

df2[df2.index.get_level_values('two') > 5]


與本例類似,我們可以使用這些構(gòu)造基于任意條件進行篩選。一般來說,記住locxs專門用于基于標簽的索引,而queryget_level_values有助于構(gòu)建用于過濾的通用條件掩碼。


獎金問題

如果我需要分割一個MultiIndex ?

實際上,這里的大多數(shù)解決方案也適用于列,只是做了一些小改動??紤]:

np.random.seed(0)mux3 = pd.MultiIndex.from_product([
        list('ABCD'), list('efgh')], names=['one','two'])df3 = pd.DataFrame(np.random.choice(10, (3, len(mux))), columns=mux3)print(df3)one  A           B           C           D         
two  e  f  g  h  e  f  g  h  e  f  g  h  e  f  g  h0    5  0  3  3  7  9  3  5  2  4  7  6  8  8  1  61    7  7  8  1  5  9  8  9  4  3  0  3  5  0  2  32    8  1  3  3  3  7  0  1  9  9  0  4  7  3  2  7

以下是您需要對這四個習(xí)慣用法所做的更改,以便讓它們處理列。

  1. 切成片loc,使用

    df3.loc[:, ....] # Notice how we slice across the index with `:`.

    或,

    df3.loc[:, pd.IndexSlice[...]]
  2. 使用xs在適當(dāng)?shù)那闆r下,只需傳遞一個參數(shù)。axis=1.

  3. 可以直接訪問列級別的值。df.columns.get_level_values..然后你需要做一些類似的事情

    df.loc[:, {condition}]

    哪里{condition}表示使用columns.get_level_values.

  4. 使用query,您的唯一選項是轉(zhuǎn)置,查詢索引,然后再次轉(zhuǎn)置:

    df3.T.query(...).T

    不建議使用其他3種選項之一。


查看完整回答
反對 回復(fù) 2019-07-13
  • 1 回答
  • 0 關(guān)注
  • 208 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號