【问题标题】:How can I append a different element for each list in a column in pandas?如何为熊猫列中的每个列表附加不同的元素?
【发布时间】:2020-05-21 12:03:05
【问题描述】:

我有一个数据框 df,其中包含特定列 col_a 中的列表。例如,

df = pd.DataFrame()
df['col_a'] = [[1,2,3], [3,4], [5,6,7]]

我想在这些列表上使用条件并应用特定的修改,包括追加。例如,假设如果列表的长度> 2,我想追加另一个元素,这是当前列表的最后两个元素的总和。所以,考虑到上面的第一个列表,我有 [1, 2, 3] 并且我想要 [1, 2, 3, 5]。

我尝试做的是:

df.loc[:, col_a] = df[col_a].apply(
                    lambda value: value.append(value[-2]+value[-1]) 
                          if len(value) > 1 else value)

但是对于该列的所有元素,该列中的结果是None。

有人可以帮帮我吗?

非常感谢您。

【问题讨论】:

标签: python-3.x pandas list if-statement apply


【解决方案1】:

问题在于append 是一个就地函数并返回None。您需要将两个列表添加在一起。所以一个带有虚拟变量的工作示例是:

df = pd.DataFrame({'cola':[[1,2],[2,3,4]], 'dum':[1,2]})
df['cola']=df.cola.apply(lambda x: (x+[sum(x[-2:])] if len(x)>2 else x))

【讨论】:

  • 我相信她想附加最后两个元素,而不是它们的总和:x+ x[-2:]
  • @Andrea 我相信这部分问题明确要求附加总和“我想附加另一个元素,这是最后两个元素的总和”
  • 我的错,你完全正确,我没有看到斐波那契来 XD
  • 谢谢,它有效!我只是不明白为什么需要虚拟变量。我试图只使用第二行代码,它单独工作。你能解释一下这个想法吗?
  • @sofiacosta29 这不是必需的,只是数据框中的额外列以确保 DF 的其余部分正常。如果可行,请考虑接受它作为解决方案。
【解决方案2】:

如果你想使用 append 试试这个:

def my_logic_for_list(values):
    if len(values) > 2:
        return values + [values[-2]+values[-1]]
    return values
df['new_a'] = df['a'].apply(my_logic_for_list)

你不能在 lambda 函数中使用 append。

【讨论】:

  • 列表将通过引用而不是值传递给函数。所以这个解决方案在函数运行时更改了dataFrame,然后再次覆盖它,这是不必要的操作。
猜你喜欢
  • 1970-01-01
  • 2022-07-11
  • 1970-01-01
  • 2017-02-06
  • 2020-09-20
  • 2020-07-24
  • 1970-01-01
  • 2021-03-21
  • 2017-05-18
相关资源
最近更新 更多