我正在清理数据框。数据帧包含三列 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/