簡體   English   中英

按列表中(不)的索引值對 Pandas dataframe 進行切片

[英]Slice Pandas dataframe by index values that are (not) in a list

我有一個pandas dataframe, df

我想要 select df不在列表、 blacklist.

現在,我使用列表理解來創建所需的切片標簽。

ix=[i for i in df.index if i not in blacklist]  
df_select=df.loc[ix]

工作正常,但如果我需要經常這樣做可能會很笨拙。

有一個更好的方法嗎?

在索引上使用isin並反轉布爾索引以執行標簽選擇:

In [239]:

df = pd.DataFrame({'a':np.random.randn(5)})
df
Out[239]:
          a
0 -0.548275
1 -0.411741
2 -1.187369
3  1.028967
4 -2.755030
In [240]:

t = [2,4]
df.loc[~df.index.isin(t)]
Out[240]:
          a
0 -0.548275
1 -0.411741
3  1.028967

您可以使用set()來創建原始索引和要刪除的索引之間的差異:

df.loc[set(df.index) - set(blacklist)]

它的優點是簡潔,並且比列表理解更容易閱讀。

感謝 ASGM; 我發現我需要將集合變成一個列表才能使其與 MultiIndex 一起使用:

mi1 = pd.MultiIndex.from_tuples([("a", 1), ("a", 2), ("b", 1), ("b", 2)])
df1 = pd.DataFrame(data={"aaa":[1,2,3,4]}, index=mi1)
setValid = set(df1.index) - set([("a", 2)])
df1.loc[list(setValid)] # works
df1.loc[setValid] # fails

(抱歉不能評論,代表不足)

您可以使用 difference() 來獲取原始索引與要排除的索引之間的差異:

df.loc[df.index.difference(blacklist), :]

它的優點是更容易閱讀。

import pandas as pd
df = pd.DataFrame(data=[5,6,7,8], index=[1,2,3,4], columns=['D',])
blacklist = [2,3]
#your current way ...
ix=[i for i in df.index if i not in blacklist]  
df_select=df.loc[ix]

# use a mask
mask = [True if x else False for x in df.index if x not in blacklist]
df.loc[mask]

http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-label實際上, loc 和 iloc 都采用布爾數組,在這種情況下為mask 從現在開始你可以重復使用這個面具,應該會更有效率。

如果您正在尋找一種選擇條件之外的所有行的方法,您可以使用np.invert() ,因為條件返回一個布爾數組。

df.loc[np.invert(({condition 1}) & (condition 2))]

query中,您可以使用@訪問您的變量blacklist

df.query('index != @blacklist')

# Or alternatively:
df.query('index not in @blacklist')
df = pd.DataFrame(data=[5,6,7,8], index=[1,2,3,4], columns=['D',])
blacklist = [2,3]

df.drop(blacklist,0)

您可以使用np.setdiff1d function 找到兩個 arrays 的集合差異。

index = np.array(blacklist)
not_index = np.setdiff1d(df.index.to_numpy(), index)
df.iloc[not_index]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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