我需要根据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().
一种方法是使用.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
,除了c1
是Value
,在这种情况下,你想将它分配给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
尝试:
df['c2'] = df['c1'].apply(lambda x: 10 if x == 'Value' else x)
您可以使用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
我建议分两步完成:
# 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']