我想要过滤一个数据帧(DataFrame)中某一列的数据在一个列表中的行。
翻译后:
翻译后:
我想从一个数据帧(DataFrame)中过滤掉某一列中数据在一个列表中的行。
df[df['column'].isin(mylist)]
我发现 ".isin()" 方法区分大小写,有没有不区分大小写的方法?
一种方法是通过将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
我更喜欢使用通用的.apply
myset = set([s.lower() for s in mylist])
df[df['column'].apply(lambda v: v.lower() in myset)]
set
比 list
更快。|
条件。 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
为了达到与上述相同的目的,可以使用以下代码:
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
mylist=['a', 'b', 'c', 'elephant']
然后df["Apple"].str.fullmatch("|".join(mylist), case=False)
。 - undefinedstr
方法将其转换为字符串并获取小写版本。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
我会将我的列表放入CSV文件中,并将其加载为数据框。然后,我会运行以下命令:
df_done = df[df["Server Name"].str.lower().isin(df_compare["Computer Name"].str.lower())]
这避免了使用for循环,可以轻松处理大量的数据。
df = 5000 rows
df_compare = 1000 rows
.isin(map(str.lower, mylist))
- Zero