我想用DataFrame列中的某一列過濾出一些行,這些列中的數據都在列表中。python pandas.Series.isin不區分大小寫
df[df['column'].isin(mylist)]
但我發現它區分大小寫。 有沒有任何方法使用「.isin()」不區分大小寫?
我想用DataFrame列中的某一列過濾出一些行,這些列中的數據都在列表中。python pandas.Series.isin不區分大小寫
df[df['column'].isin(mylist)]
但我發現它區分大小寫。 有沒有任何方法使用「.isin()」不區分大小寫?
的一種方法是用相同的列表
df[df['column'].str.lower().isin([x.lower() for x in mylist])]
系列的大寫或小寫比較
這裏的好處是,我們不保存到原來的DF或列表進行任何更改操作更快捷
考慮這個虛擬DF:
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
使用str
方法將其轉換爲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
我喜歡使用一般的.apply
myset = set([s.lower() for s in mylist])
df[df['column'].apply(lambda v: v.lower() in myset)]
在set
的查找處於list
或,'.isin(地圖(str.lower,MYLIST))比的查找更快' – Zero
@JohnGalt,是的。只是列表理解速度比map()更快,如果df的大小很大,那麼這很重要。 – Vaishali
非常整潔的答案! +1 – MaxU