如何在pandas中比较两个单元格与字符串?

时间:2018-06-07 04:21:48

标签: python pandas dataframe compare analysis

我有一个pandas数据帧如下:

  

第一个目标获胜者

     

阿尔及利亚巴西
  阿根廷阿根廷   日本德国
  巴西巴西
  法国法国

我想检查第一个进球者是否是比赛的胜利者。有人可以帮忙吗?

2 个答案:

答案 0 :(得分:4)

你需要:

df['is_winnder'] = df['FIRST GOAL'].str.lower() == df['WINNER'].str.lower()

输出:

    FIRST GOAL  WINNER   is_winnder
0    Algeria     brazil       False
1  Argentina  Argentina        True
2      Japan    Germany       False
3     brazil     brazil        True
4     france     France        True

答案 1 :(得分:0)

IIUC:
您需要将franceFrance进行比较,这需要对字符串进行规范化。我们可以制作所有字母UPPERlowerTitle。我和lower一起去了。

nunique

堆叠,然后使用str.lower来规范化大小写 在这个答案中,我堆叠了数据帧,只需要在堆叠的Series对象上调用str.lower一次。然后,我确定了每个索引的第一级的唯一值的数量,这是我们的旧行。如果唯一值的数量等于1,则列必须相等。

df.stack().str.lower().groupby(level=0).nunique().eq(1)

0    False
1     True
2    False
3     True
4     True
dtype: bool

或者

df.assign(is_winner=df.stack().str.lower().groupby(level=0).nunique().eq(1))

  FIRST GOAL     WINNER  is_winner
0    Algeria     brazil      False
1  Argentina  Argentina       True
2      Japan    Germany      False
3     brazil     brazil       True
4     france     France       True

Series.str.lower

除了我添加str.lower()之外,这几乎与Harv Ipan的答案完全相同。

df.assign(is_winner=df['FIRST GOAL'].str.lower() == df['WINNER'].str.lower())

applymap

这很简洁。使用applymap使用str.lower的一次通话。然后,我将values数组解压缩到eq运算符中,这很棘手。

from operator import eq

df.assign(winner=eq(*df.applymap(str.lower).values.T))