gpt4 book ai didi

python - 在 Python 中使用 Lambda 过滤数据框

转载 作者:行者123 更新时间:2023-11-30 21:52:00 25 4
gpt4 key购买 nike

我在 python 中有两个数据框:df 和 list:

data1 = [[0, ("a","b")], [1, ("d","e")], [2, ("a","e")],[3,("f", "g")],[4,("c","h")]]
df = pd.DataFrame(data1, columns = ['Row', 'Letters'])
data2 = [[0,"a"],[1,"b"],[2,"c"]]
list = pd.DataFrame(data2, columns = ['Row', 'Letters'])

我现在只想过滤 df 中的行,以便在 list['Letters'] 中找到 df['Letters'] 中的任何

Any 函数适用于单独的行:

any(item in df["Letters"][1] for item in list['Letters'])
any(item in df["Letters"][2] for item in list['Letters'])

分别正确返回 False 和 True。

现在如何过滤整个数据框?

我尝试了以下代码:

new_df = df[df.apply(lambda x : any(item in x["Letters"] for item in list), axis=1)]

当我只想返回第 0、2 和 4 行时,它会返回一个空数据帧。

如有任何帮助,我们将不胜感激。

最佳答案

您可以将数据帧构造函数与 stack 结合使用,然后使用 series.isinany 进行比较,以获取 level=0 >

df[pd.DataFrame(df['Letters'].tolist()).stack().isin(list_['Letters']).any(level=0)]
<小时/>
  Row Letters
0 0 (a, b)
2 2 (a, e)
4 4 (c, h)

注意:我已更改将列表保存为 list_list 变量,因为您不应使用与内置函数相同的变量名称

较大数据框的基准测试:

m = pd.concat([df]*10000,ignore_index=True)
%%timeit
m[pd.DataFrame(m['Letters'].tolist()).stack().isin(list_['Letters']).any(level=0)]
#25.3 ms ± 1.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

%%timeit
m.loc[~m['Letters'].apply(lambda x: set(x).isdisjoint(set(list_['Letters'])))]
#644 ms ± 8.38 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
m[m.Letters.apply(lambda x : any(item in list_.Letters.to_numpy().tolist() for item in x))]
#665 ms ± 13.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%%timeit
m.loc[m['Letters'].apply(lambda x: len(set(x).intersection(set(list_['Letters']))) > 0)]
#707 ms ± 56.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

关于python - 在 Python 中使用 Lambda 过滤数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60007051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com