簡體   English   中英

將.isin 應用於 pandas 中每一行的有效方法

[英]Efficient way to apply .isin to each row in pandas

我如何將.isin 用於 pandas,它將使用 dataframe 中每一行的值,而不是 static 值。

例如,假設我們有 dataframe 像:

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' 中的值在 df['b'] 中,我可以執行以下操作:

def check(a, b):
    return a in b

test = list(map(check, df['a'], df['b']))

當然,在這個例子中,df['b'] 中的所有值都是相同的,但可以假裝不是。

不幸的是,這比使用.isin 慢了大約 5 倍。 我的問題是,有沒有一種方法可以使用.isin,但對於 df['b] 中的每個值? 或者不一定必須使用.isin,但是什么是更有效的方法呢?

您可以in此處使用DataFrame.apply

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM