如果您具有这样的Pandas数据框,则可以通过以下方式进行过滤:
df = pd.DataFrame({'name1': ['apple','pear','applepie','APPLE'],
'name2': ['APPLE','PEAR','apple','APPLE']
})
df[df['name1'] != df['name2']] # works
但是,当您想比较列的上限值时,如何过滤行呢?
df[df['name1'].upper() != df['name2'].upper()] # does not work
答案 0 :(得分:4)
您需要使用pandas.Series.str.upper()
,因为df['name1']
是一系列字符串,因此我们使用.str
字符串访问器进行矢量化字符串操作。
df[df['name1'].str.upper() != df['name2'].str.upper()]
输出:
name1 name2
2 applepie apple
答案 1 :(得分:1)
通常,处理大熊猫中的字符串时使用列表推导会更快。
# In a shell
PID=$$
...
// Some Python Exception happens
os.system('kill -9' + $PID)
一些时间:
pd.DataFrame(
[[i, j] for i, j in zip(df.name1, df.name2) if i.upper() != j.upper()],
columns=df.columns
)
name1 name2
0 applepie apple
答案 2 :(得分:1)
仅用于ASCII,请检查上述:)
仅作为观察,在@Veedrac的 this very good answer 之后,如果要比较多种语言中许多行的不区分大小写,则可能需要normalize
并先casefold
个值
df.col.str.normalize('NFKD').transform(str.casefold)
示例
df=pd.DataFrame({'t':['a','b','A', 'ê', 'ê', 'Ê', 'ß', 'ss']})
df.t.duplicated()
0 False
1 False
2 False
3 False
4 False
5 False
6 False
7 False
和
df.t.str.lower().duplicated()
0 False
1 False
2 True
3 False
4 False
5 True
6 False
7 False
但是
df.t.str.normalize('NFKD').transform(str.casefold).duplicated(keep=False)
0 True
1 False
2 True
3 True
4 True
5 True
6 True
7 True