Pandas/Python:根据另一列中的值设置一列的值

新手上路,请多包涵

我需要根据 Pandas 数据框中另一列的值设置一列的值。这是逻辑:

 if df['c1'] == 'Value':
    df['c2'] = 10
else:
    df['c2'] = df['c3']

我无法让它做我想做的事,即简单地创建一个具有新值的列(或更改现有列的值:任何一个都适合我)。

如果我尝试运行上面的代码,或者将其编写为函数并使用 apply 方法,我会得到以下信息:

 ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

原文由 NLR 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 485
2 个回答

一种方法是使用索引 .loc

例子

在没有示例数据框的情况下,我将在这里制作一个:

 import numpy as np
import pandas as pd

df = pd.DataFrame({'c1': list('abcdefg')})
df.loc[5, 'c1'] = 'Value'

>>> df
      c1
0      a
1      b
2      c
3      d
4      e
5  Value
6      g

Assuming you wanted to create a new column c2 , equivalent to c1 except where c1 is Value , in which case, you would like将其分配给 10:

首先,您可以创建一个新列 c2 ,并将其设置为 c1 ,使用以下两行之一(它们基本上做同样的事情):

 df = df.assign(c2 = df['c1'])
# OR:
df['c2'] = df['c1']

然后,使用 .loc 找到 c1 等于 'Value' --- 的所有索引,并在 c2 中指定您想要的值:

 df.loc[df['c1'] == 'Value', 'c2'] = 10

你最终会得到这个:

 >>> df
      c1  c2
0      a   a
1      b   b
2      c   c
3      d   d
4      e   e
5  Value  10
6      g   g

如果,正如您在问题中所建议的那样,您有时可能只想 替换已有列中的值,而不是创建新列,然后跳过列创建,并执行以下操作:

 df['c1'].loc[df['c1'] == 'Value'] = 10
# or:
df.loc[df['c1'] == 'Value', 'c1'] = 10

给你:

 >>> df
      c1
0      a
1      b
2      c
3      d
4      e
5     10
6      g

原文由 sacuL 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用 np.where() 根据指定条件设置值:

 #df
   c1  c2  c3
0   4   2   1
1   8   7   9
2   1   5   8
3   3   3   5
4   3   6   8

现在根据您的情况更改列 ['c2'] 中的值(或设置)。

 df['c2'] = np.where(df.c1 == 8,'X', df.c3)

   c1  c2  c3
0   4   1   1
1   8   X   9
2   1   8   8
3   3   5   5
4   3   8   8

原文由 DJK 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题