按不在lis中的索引值对Pandas数据帧进行切片

2024-05-14 20:43:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个pandas数据帧,df

我想选择列表中的所有索引,df中的不是

现在,我使用列表理解来创建所需的标签。

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

工作很好,但如果我需要经常这样做,可能会很笨拙。

有更好的办法吗?


Tags: 数据inpandasdf列表forindexif
3条回答

对索引使用^{},并反转布尔索引以执行标签选择:

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
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。从现在起,你可以重复使用这个面具,应该更有效。

可以使用^{}在原始索引和要删除的索引之间创建差异:

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

它的优点是省钱,而且比列表理解更容易阅读。

相关问题 更多 >

    热门问题