【发布时间】:2019-02-04 09:22:23
【问题描述】:
拥有一个由人和订单组成的数据框...
person order elements
Alice [drink, snack, salad, fish, dessert] 5
Tom [drink, snack] 2
John [drink, snack, soup, chicken] 4
Mila [drink, snack, soup] 3
我想知道顾客的主餐是什么。因此,我想添加另一列 [main_meal],这将是我的 df。
person order elements main_meal
Alice [drink, snack, salad, fish, dessert] 5 fish
Tom [drink, snack] 2 none
John [drink, snack, soup, chicken] 4 chicken
Mila [drink, snack, soup] 3 none
规则是,如果客户点了 4 餐或更多餐,则意味着第 4 个元素始终是主菜,所以我想从 order 列的列表中提取第 4 个元素。如果它包含少于 4 个元素,则将“main_meal”分配给 none。我的代码:
df['main_meal'] = ''
if df['elements'] >= 4:
df['main_meal'] = df.order[3]
else:
df['main_meal'] = 'none'
它不起作用:
ValueError Traceback (most recent call last)
<ipython-input-100-39b7809cc669> in <module>()
1 df['main_meal'] = ''
2 df.head(5)
----> 3 if df['elements'] >= 4:
4 df['main_meal'] = df.order[3]
5 else:
~\Anaconda\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
1571 raise ValueError("The truth value of a {0} is ambiguous. "
1572 "Use a.empty, a.bool(), a.item(), a.any() or
a.all()."
-> 1573 .format(self.__class__.__name__))
1574
1575 __bool__ = __nonzero__
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我的代码有什么问题?
【问题讨论】:
-
df['elements'] >= 4是一个数组。有些元素可能是真的,有些可能是假的。你必须解释if语句你想如何处理这种情况。 -
@DYZ 我认为他的意思是
if len(df['elements']) >= 4,但他没有对操作进行矢量化,他是在一行中思考。 -
这个问题有几十个骗子。这是one。
-
np.where(len(df.order.str.len()>4),df.order.str[3],'None')