首页 > 解决方案 > 熊猫:如何根据满足特定条件的其他两列添加一列

问题描述

我有这些数据,其中有一列表示颜色,另一列表示字母。如果颜色和字母“属于”在一起,则数据正确,因此新列应显示 C。否则,应显示 I。

我是这样做的,但问题是,这只会将所有正确的放在顶部,将不正确的放在底部:

#correct
c1 = df['color'].eq('green') & df['value'].eq('V')
c2 = df['color'].eq('blue') & df['value'].eq('A')
c3 = df['color'].eq('red') & df['value'].eq('R')
m = c1 | c2 | c3

correct_df = df.loc[m, ['Person ID','word', 'rt', 'color']]

correct_df['accuracy'] = 'C'

incorrect_df = df.loc[~m, ['word', 'rt', 'color']]
incorrect_df['accuracy'] = 'I'

df_cor_inc = correct_df.append([incorrect_df])

我需要的是把另一列添加到一边,并说明响应是否正确,但按照数据已经存在的顺序。

这是一个数据样本:

Person ID  value  word    color  correct  rt
0           R     FLOWER  red     r       1223
0           B     CAR     blue    b       33    
1           G     KNIFE   blue    b       333
1           R     CAT     red     r       2332  
2           B     CHILD   green   g       232

这就是我希望它看起来的样子:

Person ID  value  word    color  correct  rt    accuracy
0           R     FLOWER  red     r       1223  C
0           B     CAR     blue    b       33    C
1           G     KNIFE   blue    b       333   I
1           R     CAT     red     r       2332  C
2           B     CHILD   green   g       232   I

标签: pythonpandasdataframe

解决方案


重用你的布尔掩码m,我们可以使用np.where()如下:

df['accuracy'] = np.where(m, 'C', 'I')

np.where()就像一个 if-then-else 语句。如果第一个参数的条件为True,则根据第二个参数设置值('C'这里);否则,它将根据第三个参数('I'此处)设置值。

结果:

print(df)

   Person ID value    word  color correct    rt accuracy
0          0     R  FLOWER    red       r  1223        C
1          0     B     CAR   blue       b    33        I
2          1     G   KNIFE   blue       b   333        I
3          1     R     CAT    red       r  2332        C
4          2     B   CHILD  green       g   232        I

推荐阅读