我如何在熊猫中使用.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})


如果我想比较列'b'的每个值(如果'a'中的值在d​​f ['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,但是哪种方法更有效?

最佳答案

您可以在此处将DataFrame.applyin一起使用:

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_comprehensionzip更快:

[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)

关于python - 将.isin应用于 Pandas 的每一行的有效方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58719391/

10-11 23:55