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

问题描述 投票:22回答:4

我需要根据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().
python pandas conditional
4个回答
31
投票

一种方法是使用.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

假设你想要创建一个新的列c2,相当于c1,除了c1Value,在这种情况下,你想将它分配给10:

首先,您可以使用以下两行之一创建一个新列c2,并将其设置为等效为c1(它们基本上执行相同的操作):

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

然后,使用c1查找'Value'等于.loc的所有索引,并在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

给你:

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

7
投票

尝试:

df['c2'] = df['c1'].apply(lambda x: 10 if x == 'Value' else x)


5
投票

您可以使用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  c3 c4
0   4   1  1
1   8   9  X
2   1   8  8
3   3   5  5
4   3   8  8

1
投票

我建议分两步完成:

# set fixed value to 'c2' where the condition is met
df.loc[df['c1'] == 'Value', 'c2'] = 10

# copy value from 'c3' to 'c2' where the condition is NOT met
df.loc[df['c1'] != 'Value', 'c2'] = df[df['c1'] != 'Value', 'c3']
© www.soinside.com 2019 - 2024. All rights reserved.