python - 检查 pandas 列中的字符串并修改另一个

标签 python pandas

我正在清理数据框。数据帧包含三列 order_id 'order_item''order_type。订单类型可以是:早餐、午餐或晚餐。我想比较订单中的每个项目以确认其与订单类型匹配。如果没有,我想删除包含错误项目的元组。

菜单如下:

breakfastMenu=['Pancake', 'Coffee', 'Eggs', 'Cereal']
dinnerMenu=['Salmon', 'Fish&Chips', 'Pasta', 'Shrimp']
lunchMenu=['Steak', 'Fries', 'Burger', 'Chicken', 'Salad']

例如,您可以在第一行中看到,午餐订单包含咖啡,这是不正确的。 晚餐包括鸡蛋

数据框示例:

    order_id    order_type  order_items
0    ORDB10489  Lunch        [('Coffee', 4), ('Salad', 10), ('Chicken', 8)]
1    ORDZ00319  Dinner       [('Fish&Chips', 9), ('Pasta', 5), ('Eggs', 3)]
2   ORDB00980   Dinner       [('Pasta', 6), ('Fish&Chips', 10)]
3    ORDY10003  Breakfast    [('Coffee', 2), ('Cereal', 1)]
4   ORDK04121   Lunch        [('Steak', 9), ('Chicken', 5)]

我对 pandas 数据框没有足够的经验。但我的想法是创建一个带有 if 条件for 循环。该循环会将每个元组中的第一项与order_type以及相应的菜单列表进行比较。如果该项目不在相应的列表中,则该元组将被删除。

此草案代码只是一个开始,但它与我想要实现的目标类似:

if dirtyData['order_type'].str.contains('Breakfast').any()\
        and eval(dirtyData['order_items'][0])[0][0] not in breakfastMenu:
            print(dirtyData['order_id']) 

我添加了 eval 将元组列表从字符串转换为列表。

欢迎任何意见 谢谢,

最佳答案

apply与自定义函数结合使用。

例如:

import ast

breakfastMenu=['Pancake', 'Coffee', 'Eggs', 'Cereal']
dinnerMenu=['Salmon', 'Fish&Chips', 'Pasta', 'Shrimp']
lunchMenu=['Steak', 'Fries', 'Burger', 'Chicken', 'Salad']

check_val = {'Breakfast': breakfastMenu, 'Dinner': dinnerMenu, "Lunch": lunchMenu}

data = [['ORDB10489', 'Lunch', "[('Coffee', 4), ('Salad', 10), ('Chicken', 8)]"],
 ['ORDZ00319', 'Dinner', "[('Fish&Chips', 9), ('Pasta', 5), ('Egg', 3)]"],
 ['ORDB00980', 'Dinner', "[('Pasta', 6), ('Fish&Chips', 10)]"],
 ['ORDY10003', 'Breakfast', "[('Coffee', 2), ('Cereal', 1)]"],
 ['ORDK04121', 'Lunch', "[('Steak', 9), ('Chicken', 5)]"]]

df = pd.DataFrame(data, columns=['order_id', 'order_type', 'order_items'])
df["order_items"] = df["order_items"].apply(ast.literal_eval)
df["order_items"] = df.apply(lambda x: [i for i in x["order_items"] if i[0] in check_val.get(x["order_type"], [])], axis=1)
print(df)

输出:

    order_id order_type                     order_items
0  ORDB10489      Lunch     [(Salad, 10), (Chicken, 8)]
1  ORDZ00319     Dinner   [(Fish&Chips, 9), (Pasta, 5)]
2  ORDB00980     Dinner  [(Pasta, 6), (Fish&Chips, 10)]
3  ORDY10003  Breakfast      [(Coffee, 2), (Cereal, 1)]
4  ORDK04121      Lunch      [(Steak, 9), (Chicken, 5)]

关于python - 检查 pandas 列中的字符串并修改另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58183488/

相关文章:

python - 使用dispatch_hook()

python - TestCase self.assertEqual 不匹配类似的字符串

python-3.x - 如何使用 pandas 数据框中的列来标记气泡图/散点图?

python - 如何从一个大列表中创建一个 Numpy 数组- python

python - 操纵 Pandas 中的日期

python - 如何使用 Pandas 从csv中读取特定的列索引

python - 为什么 Django 没有查看权限?

Python 脚本只会在 PyCharm 中运行

python - 如何使用cx_Oracle在python中执行非sql命令

python - 删除所有观测值具有相同值的列是否会影响我的模型?