繁体   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