将值放入数据帧列中



好的,我用一个新的例子编辑了这个问题。

我无法在数据帧中填充新列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
)

最新更新