当前位置: 首页 > 知识库问答 >
问题:

如何用另一列列表中的特定元素填充数据框中的空列?

国景铄
2023-03-14

有一个由一个人和订单组成的数据帧...

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_-mean],这将是我的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个元素永远是主菜,所以我想从订单栏上的列表中提取第4个元素。如果它包含少于4个元素,则将main_meal分配给无。我的代码:

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().

我的代码有什么问题?

共有3个答案

南宫勇军
2023-03-14

您还可以使用应用和lambda函数。

df['main_meal'] = df['order'].apply(lambda r: r[3] if len(r) >= 4 else 'none')

对于大型数据集,它比@jpp的答案慢,但对于较小的数据集,它比@jpp和@Zero的答案更快(更详细)(注意,我添加.fillna(),因此它们返回相同的结果):

%timeit df['order'].apply(lambda r: r[3] if len(r) >= 4 else 'none')  # 242 µs
%timeit pd.DataFrame(df['order'].values.tolist())[3].fillna('none')  # 1.17 ms
%timeit df['order'].str[3].fillna('none')  # 487 µs

# Large dataset
df = pd.concat([df]*100000)

%timeit df['order'].apply(lambda r: r[3] if len(r) >= 4 else 'none')  # 118ms
%timeit pd.DataFrame(df['order'].values.tolist())[3].fillna('none')  # 51.8ms
%timeit df['order'].str[3].fillna('none')  # 309ms

如果你检查它们的值,它们会匹配。

x = df['order'].apply(lambda r: r[3] if len(r) >= 4 else 'none')
y = pd.DataFrame(df['order'].values.tolist())[3].fillna('none')
z = df['order'].str[3].fillna('none')

(x.values == y.values).all()  # True
(x.values == z.values).all()  # True

Python 3.6.6|熊猫0.23.4

夹谷琨
2023-03-14

对于小数据帧,您可以根据@Zero的解决方案使用str访问器。对于较大的数据帧,您可能希望使用NumPy表示创建一个系列:

# Benchmarking on Python 3.6, Pandas 0.19.2

df = pd.concat([df]*100000)

%timeit pd.DataFrame(df['order'].values.tolist())[3]  # 125 ms per loop
%timeit df['order'].str[3]                            # 185 ms per loop

# check results align
x = pd.DataFrame(df['order'].values.tolist())[3].fillna('None').values
y = df['order'].str[3].fillna('None').values
assert (x == y).all()
楚泳
2023-03-14

使用str方法进行切片

In [324]: df['order'].str[3]
Out[324]:
0       fish
1        NaN
2    chicken
3        NaN
Name: order, dtype: object
In [328]: df['main_meal'] = df['order'].str[3].fillna('none')

In [329]: df
Out[329]:
  person                                 order  elements main_meal
0  Alice  [drink, snack, salad, fish, dessert]         5      fish
1    Tom                        [drink, snack]         2      none
2   John         [drink, snack, soup, chicken]         4   chicken
3   Mila                  [drink, snack, soup]         3      none
 类似资料:
  • 问题内容: 如果我有一个包含多列的数据框,如何只填充一列?还是一组列? 我只知道如何按轴进行操作。 问题答案: tl; dr: 我还添加了一个自我包含的示例:

  • 我正在为大学做一个项目。我刚刚学习了Java和JavaFX。 我有问题,也许有人能帮我。 有了这个小软件,你可以计划一周的任务。在tableview中,您有星期一到星期五的列。 我有一个数据库,在那里我可以获取对象“auftragsveretilung”(意思是任务,计划在特定日期)。这些对象有一个序列号(=seriennr)和一个日期(=bearbeitungsdatum)。 为了在tablev

  • 我的熊猫数据框中有2列。 我想去掉可乐和可乐,用可乐代替。 基本上,我需要用cola和colb中的值填充colc。如果可乐中有一个楠,那么它会从可乐中拉出,如果可乐中有一个楠,它会从可乐中拉出。如果可乐和可乐中没有楠,它们应该总是相等的。 我将如何在熊猫身上实现这一点?

  • 问题内容: 我有两个看起来像的清单: 我要做的是将list1的所有那些元素都保留在list2中。结果应该是: 问题答案: 使用运算符,您可以检查元素是否在序列中。 使用列表理解: 但是效率不高。您最好转换为对象。

  • 问题内容: 给出以下列表: 我想将[a]的每个元素重复其在[b]中的对应位置的编号,以产生此结果: 即0发生1次,5发生2次,1发生1次。 问题答案: 内容如下: -重复elem次 从两个列表中组成一个2元组的列表,将每个元素与另一个列表中的对应元素配对。这为您提供了用例中需要传递给的确切信息。 -将迭代器的结果列表展平为单个值列表。您既可以像我一样,也可以像马丁·彼得斯那样。

  • 根据和的公共列在中使用填充列的最佳方法是什么? 得到: 编辑:我还想将列名更改为,这样预期的输出如下所示: 尝试过: 它发现了错误: 更新2: : :