Python Pandas.Series.isin 不区分大小写

23
我想要过滤一个数据帧(DataFrame)中某一列的数据在一个列表中的行。
翻译后:

我想从一个数据帧(DataFrame)中过滤掉某一列中数据在一个列表中的行。

df[df['column'].isin(mylist)]

我发现 ".isin()" 方法区分大小写,有没有不区分大小写的方法?

5个回答

41

一种方法是通过将Series的大小写与列表的大小写进行比较来实现。

df[df['column'].str.lower().isin([x.lower() for x in mylist])]

这里的优势在于我们没有对原始数据框或列表进行任何更改,从而使操作更加高效。

考虑这个虚拟数据框:

    Color   Val
0   Green   1
1   Green   1
2   Red     2
3   Red     2
4   Blue    3
5   Blue    3

对于列表 l:

l = ['green', 'BLUE']

你可以使用isin()方法

df[df['Color'].str.lower().isin([x.lower() for x in l])]

你获得

    Color   Val
0   Green   1
1   Green   1
4   Blue    3
5   Blue    3

1
或者,.isin(map(str.lower, mylist)) - Zero
1
@JohnGalt,是的。只是列表推导比map()更快,如果df的大小很大,这将很重要。 - Vaishali
非常整洁的答案!+1 - MaxU - stand with Ukraine
@MaxU,谢谢:) - Vaishali
谢谢您的回答。我的问题得到了很好的解决 :) - haoping

2

我更喜欢使用通用的.apply

myset = set([s.lower() for s in mylist])
df[df['column'].apply(lambda v: v.lower() in myset)]

在查找元素时,setlist 更快。

1
在Pandas 1.1.0版本中,您可以使用fullmatch函数,并将列表转换为|条件。 match有一个选项可以关闭大小写敏感性。
例如:考虑数据框df
    Apple   Banana      Orange
0   A       Boy         Cat
1   Ivan    Elephant    Gold

df.Apple.str.lower().isin(['a', 'c', 'd', 'elephant']) 返回以下结果:

0     True
1    False
Name: Apple, dtype: bool

df.Banana.str.lower().isin(['a', 'c', 'd', 'elephant']) 返回:

0    False
1     True
Name: Banana, dtype: bool

Pandas fullmatch函数,使用case=False参数

为了达到与上述相同的目的,可以使用以下代码:
df.Apple.str.fullmatch('a|c|d|elephant', case=False)

df.Banana.str.fullmatch('a|c|d|elephant', case=False)
分别会给出正确的结果。

0     True
1    False
Name: Apple, dtype: bool

并且

0    False
1     True
Name: Banana, dtype: bool

1
这是一个很棒的答案。可以制作一个通用的东西。mylist=['a', 'b', 'c', 'elephant']然后df["Apple"].str.fullmatch("|".join(mylist), case=False) - undefined

1
使用str方法将其转换为字符串并获取小写版本。
In [23]: df =pd.DataFrame([['A', 'B', 'C'], ['D', 'E', 6]], columns=['A', 'B', '
    ...: C'])

In [24]: df
Out[24]: 
   A  B  C
0  A  B  C
1  D  E  6

In [25]: df.A
Out[25]: 
0    A
1    D
Name: A, dtype: object

In [26]: df.A.str.lower().isin(['a', 'b', 'c'])
Out[26]: 
0     True
1    False
Name: A, dtype: bool

0

我会将我的列表放入CSV文件中,并将其加载为数据框。然后,我会运行以下命令:

df_done = df[df["Server Name"].str.lower().isin(df_compare["Computer Name"].str.lower())]

这避免了使用for循环,可以轻松处理大量的数据。

df = 5000 rows
df_compare = 1000 rows

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接