如何基于列值比较在python中过滤Pandas数据框?

时间:2018-07-24 14:14:12

标签: python pandas

如果您具有这样的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

3 个答案:

答案 0 :(得分:4)

您需要使用pandas.Series.str.upper(),因为df['name1']是一系列字符串,因此我们使用.str字符串访问器进行矢量化字符串操作。

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

输出:

       name1    name2
2   applepie    apple

答案 1 :(得分:1)

通常,处理大熊猫中的字符串时使用列表推导会更快。

# In a shell
PID=$$
...
// Some Python Exception happens
os.system('kill -9' + $PID)

一些时间:

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

答案 2 :(得分:1)

仅用于ASCII,请检查上述:)

仅作为观察,在@Veedrac的 this very good answer 之后,如果要比较多种语言中许多行的不区分大小写,则可能需要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