如果数据框的元素在列表中,则删除它们 为什么有效?什么是 lambda?

问题描述

我请求您帮助解决我正在努力解决的 Python 脚本的一部分: 我有一个包含 4 列的数据框:

           keyword  impressions  clicks   ctr
0            About          1.0     0.0    0.000000
1            Achat         12.0     2.0    16.6666667
2           Action          1.0     0.0    0.000000
3            Adele         14.0     1.0    7.14285714

此数据框包含数千行。如果“关键字”在列表中,我试图从该数据框中删除行(例如:list = {'Action','About}

这是我制作的代码行:

df.drop( df[ df['keyword'] in list ].index,inplace=True)

但我收到此错误

File "/Users/adamn/Desktop/test_lambda.py",line 87,in <module>
 df.drop( df[ df['keyword'] in exc ].index,inplace=True)
File "/Library/Frameworks/Python.framework/Versions/3.9/lib/python3.9/site- 
 packages/pandas/core/generic.py",line 1785,in __hash__
raise TypeError(
TypeError: 'Series' objects are mutable,thus they cannot be hashed

我真的不明白它代表什么......

我该如何解决?或者我应该如何处理才能得到我想要的结果?

感谢您的帮助。

解决方法

也许这就是你想要的!

df.drop( df[ df['keyword'].apply(lambda x: x in list) ].index,inplace=True)

为什么有效?

您正在检查系列 df['keyword'] 是否在列表 list 中。您必须做的是检查系列x 中的元素df['keyword'] 是否在列表list 中。因此,我们使用 apply 函数将给定函数“应用”到 pandas SeriesDataFrame 中的每个元素。

什么是 lambda?

Lambda 就像 C 中的内联函数。使用函数的等效代码是:

def func(x):
    return x in list

df.drop( df[ df['keyword'].apply(func)].index,inplace=True)

PS:我建议不要使用'list'作为变量名,因为它是python中的一种数据类型。

,

使用 boolean indexing 远比使用 apply 高效。

df = df.loc[~df.keyword.isin(['About','Action'])]

注意:如果需要,请重置索引。

df = df.loc[~df.keyword.isin(['About','Action'])].reset_index()

文档链接 -> isin / indexing/selecting data