如何对熊猫使用.isin,它将使用数据帧中每一行的值,而不是静态值。
例如,假设我们有如下数据框:
import pandas as pd
import datetime
l = []
for i in range(100000):
d = {'a':i,'b':{1,2,3},'c':0}
l.append(d)
df = pd.DataFrame(l)
如果我使用.isin,则它只能接受1个值列表(在本示例中为{1,2,3}),并且将与要比较的列中的每个值进行比较(即df [' a'])
test = df['a'].isin({1,2,3})
如果如果'a'中的值在df ['b']中,我想比较列'b'的每个值,我可以执行以下操作:
def check(a, b):
return a in b
test = list(map(check, df['a'], df['b']))
当然,在此示例中,df ['b']中的所有值都相同,但是可以假装不一样。
不幸的是,这比仅使用.isin慢大约5倍。我的问题是,除了df ['b]中的每个值,是否可以使用.isin?还是不必一定使用.isin,但是哪种方法更有效?
答案 0 :(得分:2)
您可以在此处将DataFrame.apply
与in
一起使用:
df.apply(lambda x: x['a'] in x['b'], axis=1)
0 False
1 True
2 True
3 True
4 False
...
99995 False
99996 False
99997 False
99998 False
99999 False
Length: 100000, dtype: bool
或者将list_comprehension
与zip
一起使用,速度更快:
[a in b for a, b in zip(df['a'], df['b'])]
[False,
True,
True,
True,
False,
False,
False,
False,
False,
False,
False,
False,
False,
...]
%%timeit
def check(a, b):
return a in b
list(map(check, df['a'], df['b']))
28.6 ms ± 1.18 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
[a in b for a, b in zip(df['a'], df['b'])]
22.5 ms ± 851 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
%%timeit
df.apply(lambda x: x['a'] in x['b'], axis=1)
2.27 s ± 29 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)