【问题标题】:how to compare two cells with strings in pandas?如何将两个单元格与熊猫中的字符串进行比较?
【发布时间】:2018-11-16 21:04:34
【问题描述】:
我有一个熊猫数据框如下:
第一个目标 获胜者
阿尔及利亚 巴西
阿根廷 阿根廷
日本 德国
巴西 巴西
法国 法国
我想检查第一个进球者是否是比赛的获胜者。有人可以帮忙吗?
【问题讨论】:
标签:
python
pandas
dataframe
compare
analysis
【解决方案1】:
你需要:
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
【解决方案2】:
IIUC:
您需要将 france 与 France 进行比较,这需要对字符串进行规范化。我们可以制作所有字母UPPER、lower 或Title。我选择了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))