如何基于列值比较过滤python中的数据帧?

如何基于列值比较过滤python中的数据帧?,python,pandas,Python,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 = 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
您需要使用as
df['name1']
是一系列字符串,因此我们使用字符串访问器进行矢量化字符串操作

df[df['name1'].str.upper() != df['name2'].str.upper()]
输出:

       name1    name2
2   applepie    apple
您需要使用as
df['name1']
是一系列字符串,因此我们使用字符串访问器进行矢量化字符串操作

df[df['name1'].str.upper() != df['name2'].str.upper()]
输出:

       name1    name2
2   applepie    apple

在处理pandas中的字符串时,通常使用列表理解会更快

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)

在处理pandas中的字符串时,通常使用列表理解会更快

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

df.col.str.normalize('NFKD').transform(str.casefold)
范例

但是

仅对于ASCII,请勾选上面的:)

正如@Veedrac所观察到的,如果您想比较多种语言中大量行的不区分大小写,您可能需要首先
规范化
casefold

df.col.str.normalize('NFKD').transform(str.casefold)
范例

但是