[英]How to filter a Pandas dataframe in python based on column value comparison?
如果您具有這樣的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
您需要使用pandas.Series.str.upper()
因為df['name1']
是一系列字符串,因此我們使用.str
字符串訪問器進行矢量化字符串操作。
df[df['name1'].str.upper() != df['name2'].str.upper()]
輸出:
name1 name2
2 applepie apple
通常,在處理大熊貓中的字符串時,使用列表理解可能會更快。
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
一些時間:
In [159]: df = pd.concat([df]*10000)
In [160]: %%timeit
...: pd.DataFrame(
...: [[i, j] for i, j in zip(df.name1, df.name2) if i.upper() != j.upper()]
...: ,
...: columns=df.columns
...: )
...:
14.2 ms ± 68.2 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [161]: %timeit df[df['name1'].str.upper() != df['name2'].str.upper()]
35.6 ms ± 160 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
對於僅ASCII,請檢查以上內容:)
就像一個觀察,遵循@Veedrac的一個很好的答案 ,如果您想比較多種語言中許多行的不區分大小寫,則可能需要casefold
對值進行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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.