如何基于列值比较过滤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
您需要使用asdf['name1']
是一系列字符串,因此我们使用字符串访问器进行矢量化字符串操作
df[df['name1'].str.upper() != df['name2'].str.upper()]
输出:
name1 name2
2 applepie apple
您需要使用asdf['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)
范例
及
但是