如何在Pandas中比较两个包含字符串的单元格?

3

我有一个pandas数据框,如下所示:

第一进球         获胜者

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

我想要检查第一进球的得分者是否是比赛的赢家。可以有人帮忙吗?


一个值正在尝试被设置在DataFrame的切片副本上。 请尝试使用.loc[row_indexer,col_indexer] = value代替。请参阅文档中的注意事项:http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """启动IPython内核的入口点。我遇到了这个错误。你能帮忙吗?谢谢 - Ravi Teja
Pss:如果有帮助,请考虑接受答案。 - harvpan
2个回答

6

你需要:

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

我理解为:
您需要将franceFrance进行比较,这需要对字符串进行规范化处理。我们可以将所有字母转换为UPPER, lowerTitle。我选择了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

这与Harv Ipan的答案几乎完全相同,唯一的区别是我添加了str.lower()
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))

1
非常聪明地使用了 applymap,棒极了。 - Umar.H

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接