【问题标题】:Python: Error when appending new item to a list in a pandas dataframePython:将新项目附加到熊猫数据框中的列表时出错
【发布时间】:2021-11-16 03:47:17
【问题描述】:

我有一个包含三列的 pandas 数据框:user_id(str)、list_of_purchases(列表)和一个名为 b 的二进制列。

我想创建一个名为 final_list 的第四列,它遵循以下规则:

  • b = 1 时,final_list 应该是 list_of_purchases 和项目“Success”的串联。例如,如果 list_of_purchases = ['item_1', 'item_2', 'item_3'] 那么 final_list 应该是 ['item_1', 'item_2', 'item_3' ,'成功']
  • b = 0 时,final_list 应该是 ['item_1', 'item_2', 'item_3','Null']

我尝试了以下代码,但得到了错误:

df['final_list'] = np.where(
    df['b'] == 0,
    df['list_of_purchases'] + ['Null'],
    df['list_of_purchases'] + ['Success'])

TypeError: Cannot broadcast np.ndarray with operand of type <class 'list'>

我想出了如何使用 for 循环并检查列 b 中的每一行,但它确实效率低下并且需要很长时间。

提前感谢您的帮助!

【问题讨论】:

  • df_paths 是什么,它与 df 有什么关系?
  • 嗨@Barmar!抱歉,代码不正确。没有 df_paths,只有 df。我刚刚修好了。

标签: python pandas list numpy


【解决方案1】:
#create a function:
def lista(df):
    return [df['list_of_purchases'] + ['Null'] if df['b'] == 0 else df['list_of_purchases'] + ['Success']]

#use the function on every row of df:
df['final_list'] = df.apply(lista, axis=1)

据我了解,pandas 数据框并非旨在将列表存储为它们的值,因此没有超高效的解决方案

【讨论】:

  • 因为 0 可以认为与 False 相同,而 1 可以认为是 True,df['b'] == 0 与仅使用 df['b'] 相同,但您需要根据条件来切换 Null 和 Success 情况反过来。
  • 嗨,亚当!感谢您的贡献。我更喜欢使用此解决方案的 lambda 版本,因为稍后我不需要在脚本中重用该函数。不过,谢谢!
【解决方案2】:

感觉像是 lambda 的一个很好的用途,而不是定义一个函数,尽管这两种方法都有效。

import pandas as pd
import numpy as np

data = [[1, [1,2,3]],
        [0, [4,5,6]]]
df = pd.DataFrame(data, columns=["b", "list_of_purchases"])

df["Output"] = df.apply( \
    lambda row : row["list_of_purchases"] + \
    ["Success" if row["b"] else "Null"], axis=1)

print(df)

生产:

   b list_of_purchases              Output
0  1         [1, 2, 3]  [1, 2, 3, Success]
1  0         [4, 5, 6]     [4, 5, 6, Null]

使用 lambda 的“好处”(在这里)基本上只是避免定义一个您可能永远不会重用的函数。

如果要在其他地方重用函数/逻辑,那么定义一个函数(并且使用 lambda)可能正是正确的方法。如果它只用于这个,而不是重复使用,我可能会选择 lambda。

【讨论】:

  • 非常感谢,这正是我所需要的。是的,在这种情况下使用 lambda 是首选,因为我以后不需要重用这个函数;)
猜你喜欢
  • 2014-01-03
  • 1970-01-01
  • 2020-05-21
  • 2019-04-01
  • 1970-01-01
  • 2020-09-23
  • 1970-01-01
  • 2020-02-01
  • 2015-06-16
相关资源
最近更新 更多