【问题标题】:How do I add conditionally to a selection of cells in a pandas dataframe column when the the column is a series of lists?当列是一系列列表时,如何有条件地添加到熊猫数据框列中的单元格选择中?
【发布时间】:2016-02-05 20:01:29
【问题描述】:

这是我当前困境的简化版本。

这是数据框:

            x      y       A       B 
0           ding   ding    [0, 1]  [0, 0] 
1           ding   dong    [0, 1]  [0, 0] 
2           ding   ding    [0, 1]  [0, 0] 
3           ding   ding    [0, 1]  [0, 0] 
4           ding   dong    [0, 1]  [0, 0] 
5           ding   ding    [0, 1]  [0, 0] 
6           ding   ding    [0, 1]  [0, 0] 

如何将 1 添加到 B 列中 x != y 的那些单元格。单元格是列表,1 应该插入到索引 1 处。

生成的表格如下所示:

            x      y       A       B 
0           ding   ding    [0, 1]  [0, 0] 
1           ding   dong    [0, 1]  [0, 1] 
2           ding   ding    [0, 1]  [0, 0] 
3           ding   ding    [0, 1]  [0, 0] 
4           ding   dong    [0, 1]  [0, 1] 
5           ding   ding    [0, 1]  [0, 0] 
6           ding   ding    [0, 1]  [0, 0]

非常感谢。

【问题讨论】:

  • 您的B 列是什么类型的?是list 还是str
  • 它们是列表类型

标签: python list pandas


【解决方案1】:

这行得通:

def last_one(lst):
    lst[1] = 1

df[df.x != df.y].B.apply(last_one)

df 之前:

      x     y       A       B
0  ding  ding  [0, 1]  [0, 0]
1  ding  dong  [0, 1]  [0, 0]
2  ding  ding  [0, 1]  [0, 0]
3  ding  ding  [0, 1]  [0, 0]
4  ding  dong  [0, 1]  [0, 0]
5  ding  ding  [0, 1]  [0, 0]
6  ding  ding  [0, 1]  [0, 0]

df 之后:

      x     y       A       B
0  ding  ding  [0, 1]  [0, 0]
1  ding  dong  [0, 1]  [0, 1]
2  ding  ding  [0, 1]  [0, 0]
3  ding  ding  [0, 1]  [0, 0]
4  ding  dong  [0, 1]  [0, 1]
5  ding  ding  [0, 1]  [0, 0]
6  ding  ding  [0, 1]  [0, 0]

【讨论】:

  • 是的,效果很好。我开始思考可以使用嵌套选择方法来完成,我忘记了传递一个函数来应用!
【解决方案2】:

你可以apply lambda:

df[df.x != df.y].B.apply(lambda x: x[:-1] + [1])

例子:

In [283]: df
Out[283]:
      x     y       A       B
0  ding  ding  [0, 1]  [0, 0]
1  ding  dong  [0, 1]  [0, 0]
2  ding  ding  [0, 1]  [0, 0]
3  ding  ding  [0, 1]  [0, 0]
4  ding  dong  [0, 1]  [0, 0]
5  ding  ding  [0, 1]  [0, 0]
6  ding  ding  [0, 1]  [0, 0]

mask = df.x != df.y
df.B[mask] = df.B[mask].apply(lambda x: x[:-1] + [1])

In [289]: df
Out[289]:
      x     y       A       B
0  ding  ding  [0, 1]  [0, 0]
1  ding  dong  [0, 1]  [0, 1]
2  ding  ding  [0, 1]  [0, 0]
3  ding  ding  [0, 1]  [0, 0]
4  ding  dong  [0, 1]  [0, 1]
5  ding  ding  [0, 1]  [0, 0]
6  ding  ding  [0, 1]  [0, 0]

【讨论】:

  • 我开始意识到这可以通过几种不同的方式完成。使用 lambda 也为我节省了函数定义!
  • 请注意,lambda 函数返回一个新列表,而不是插入(按照 OP 的要求)到现有列表中。如果在其他地方使用相同的列表,这可能会产生影响。
  • @orgelzyklus 我意识到我错过了在控制台中执行的 asnwer 中的一些步骤。看看编辑后的答案。
  • 再次感谢两位的澄清。
猜你喜欢
  • 2016-05-17
  • 2016-12-17
  • 2020-04-23
相关资源
最近更新 更多