我有一个pandas
数据帧,df
。Slice熊猫数据框按标签不在列表中
我想选择df
所有指数是在列表中没有,blacklist.
现在,我使用列表解析创建所需的标签切片。
ix=[i for i in df.index if i not in blacklist]
df_select=df.loc[ix]
工作正常,但如果我经常需要这样做可能很笨拙。
有没有更好的方法来做到这一点?
我有一个pandas
数据帧,df
。Slice熊猫数据框按标签不在列表中
我想选择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
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 实际上,在上述和ILOC都采取一个布尔阵列,在这种情况下,mask
。从现在开始,你可以重复使用这个面具,应该更有效率。
感谢ASGM;我发现,我需要把设定成一个列表,使其与一个多指标的工作:
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
(抱歉,无法发表评论,代表不足)
我测试了速度与使用集合(以及多索引列表)的替代方法。这种方法快两倍。我还可以确认它适用于MultiIndex – 2017-04-13 15:18:14
另一种观察:我使用@Hagrid67示例,发现索引“在列表中”和“不在列表中”之间的速度没有实际差别 – 2017-04-13 15:23:11