簡體   English   中英

如何基於列值比較在python中過濾Pandas數據框?

[英]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對值進行normalizecasefold

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM