python - 如何根据Python中列的行列表中存在的值来过滤数据框?

标签 python pandas

我有一个数据框,如下所示:

   business_id  stars  categories
0  abcd         4.0    ['Nightlife']
1  abcd1        3.5    ['Pizza', 'Restaurants']
2  abcd2        4.5    ['Groceries', 'Food']

我想根据类别列中存在的值过滤数据框。我的数据框大约有 400 000 行,我只想要其中包含类别“食品”或“餐厅”的行。

我尝试了很多方法,包括:

def foodie(x):
    for row in x.itertuples():
        if 'Food' in row[3] or 'Restaurant' in row[3]:
            return x

df = df.apply(foodie, axis=1)

但这显然是非常非常糟糕的方法,因为我在 400 000 行上使用 itertuples,并且我的系统继续处理无限长的时间。

我还尝试在 df[df['categories']] 中使用列表理解。但不能,因为它们都像 df[df['stars']==4.0] 一样进行过滤。甚至我看到的所有 apply() 方法都是针对列中具有单个值的列实现的。

那么,如何使用相当快速的迭代行实现对数据帧进行子集化,同时仅选择类别中包含“食品”或“餐厅”的行?

最佳答案

您可以在类别列上使用 apply 方法,检查每个元素是否包含 FoodRestaurants,并据此创建逻辑用于子集化的索引数组:

df.loc[df.categories.apply(lambda cat: 'Food' in cat or 'Restaurants' in cat)]

#     business_id             categories      stars
# 1         abcd1   [Pizza, Restaurants]        3.5
# 2         abcd2      [Groceries, Food]        4.5

关于python - 如何根据Python中列的行列表中存在的值来过滤数据框?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032524/

相关文章:

python - 通过 alembic 脚本并发数据库表索引

pandas - 在数据框中移动列

python - 根据纬度/经度和半径选择 geopandas 或 pandas 中的行

python - images/create 处的类型错误 - __init__() 获得意外的关键字参数 'save'

python - 我的 CI 作业以 root 身份创建 __pycache__,无法在下次运行时清理工作区

python - 在 Pandas 数据框中存储字典

python - 正则表达式仅在短单词之后删除点,而不在长单词之后删除点

python - 按列对 pandas DataFrame 进行分组并从列组中生成列表

python - 无法使用 DataFrame.eval() 减去 datetime64

python - 包已经满足但无法导入