好的,我用一个新的例子编辑了这个问题。
我无法在数据帧中填充新列df['Colour']
。
#我举了一个答案的例子:
d = {"symbol":["Heart", "Heart", "Diamond", "Spade"], "symbol2":["Heart","Diamond", "Spade", "Spade"]}`
df_s = pd.DataFrame(d)
df_s['color'] = df_s['symbol'].map(lambda x: 'Correct' if x == df_s['symbol2'] else 'Wrong')
使用此代码,我想创建一个名为"Colour"的新列,并用'Correct'
或'Wrong'
的值填充空白。
但我只得到错误:
Error: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
我做错了什么?
编辑:错误保持不变。
让我们假设您的数据帧具有以下结构:
d = {"symbol":["Heart", "Heart", "Diamond", "Spade"]}
df = pd.DataFrame(d)
print(df)
symbol
0 Heart
1 Heart
2 Diamond
3 Spade
您可以在"符号"列上使用.map
来实现所需的结果:
df['color'] = df['symbol'].map(lambda x: 'red' if x == 'Heart' else 'not red')
print(df)
symbol color
0 Heart red
1 Heart red
2 Diamond not red
3 Spade not red
编辑
根据OP的新编辑,如果希望考虑多列条件,最好使用.apply
行:
df_s['color'] = df_s.apply(lambda r: 'red' if r[0]=='Heart' and r[1]=='Heart' else 'not red', axis=1)
要检查两列是否相同,可以(使用相同的逻辑(:
df_s.apply(lambda r: 'correct' if r[0]==r[1] else 'wrong', axis=1)
如果您想检查所有列或更多,则2:
df_s.apply(lambda r: 'correct' if len(set(r)) == 1 else 'wrong', axis=1)
如果一行中的所有列都相同,则该行的set()
将具有长度1。
问题是,你想查看每一行中的一个值,如果该行中的值等于"Heart"
,你就想对它做点什么。然而,你所做的是查看整个系列,python不知道该怎么做(什么时候是真的,应该怎么做?如果所有元素都是真的(a.all()
(或至少一个(a.any()
(或…(。
为了达到你的要求,你可以做例如:
df.loc[df['symbole'] == 'Heart', 'Colour'] = 'red'
df.loc[df['symbole'] != 'Heart', 'Colour'] = 'not red'
有关如何做到这一点的更多方法,请参阅以下答案:
在pandas数据帧中使用条件生成新列
Pandas有条件创建系列/数据帧列
您也可以使用pandas-apply:
df['color'] = df.apply(lambda row: (
'red'
if row['symbole'] == 'Heart'
else 'not red',
axis=1
)