假设我有以下Pandas Dataframe :
df = DataFrame({'A' : [5,6,3,4], 'B' : [1,2,3, 5]})
df
A B
0 5 1
1 6 2
2 3 3
3 4 5
我可以根据特定值进行子集划分:
x = df[df['A'] == 3]
x
A B
2 3 3
但是我如何基于一个值列表来划分子集呢?-类似于:
list_of_values = [3,6]
y = df[df['A'] in list_of_values]
要获得:
A B
1 6 2
2 3 3
8条答案
按热度按时间blmhpbnm1#
可以使用
isin
方法:要获得相反的结果,请使用
~
:dfuffjeb2#
您可以使用方法查询:
或
5hcedyr03#
您可以将列表中的值存储为:
lis = [3,6]
那么
df1 = df[df['A'].isin(lis)]
zkure5ic4#
另一种方法;
与isin方法不同,这在确定列表是否包含列
A
的函数时特别有用。应当注意,这种方法比
isin
方法慢。cuxqih215#
不一定是一个它可以是
set
,tuple
,dictionary
,numpy阵列,Pandas系列,发电机,range
等,isin()
和query()
仍然可以工作。选择行的一些常见问题
1.
list_of_values
是一个范围如果您需要在一个范围内过滤,您可以使用
between()
方法或query()
。2.按照
list_of_values
的顺序返回df
在OP中,
list_of_values
中的值在df
中并不按此顺序出现。如果您希望df
按它们在list_of_values
中出现的顺序返回,即按list_of_values
"排序",请使用loc
。如果要保留旧索引,可以使用以下方法。
3.不要使用
apply
一般来说,
isin()
和query()
是完成此任务的最佳方法;不需要apply()
,例如,对于列A
上的函数f(A) = 2*A - 5
,isin()
和query()
的工作效率都高得多:4.选择不在
list_of_values
中的行要选择不在
list_of_values
中的行,请对isin()
/in
求反:5.选择
list_of_values
中包含多列的行如果您想使用两个(或多个)列进行过滤,可以使用
any()
和all()
来根据需要减少列数(axis=1
)。1.选择
A
或B
中至少有一个在list_of_values
中的行:1.选择
A
和B
都在list_of_values
中的行:奖金:
也可以在
query()
中调用isin()
:fwzugrvs6#
F弦更棘手
wnvonmuf7#
上面的答案是正确的,但是如果您仍然不能按预期筛选出行,请确保两个DataFrame的列具有相同的
dtype
。花了我够长时间。
whlutmcx8#
在速度方面进行比较的非Pandas解决方案可能是: