2017-08-14 113 views
1

我想用DataFrame列中的某一列過濾出一些行,這些列中的數據都在列表中。python pandas.Series.isin不區分大小寫

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

但我發現它區分大小寫。 有沒有任何方法使用「.isin()」不區分大小寫?

回答

7

的一種方法是用相同的列表

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 
+1

或,'.isin(地圖(str.lower,MYLIST))比的查找更快' – Zero

+1

@JohnGalt,是的。只是列表理解速度比map()更快,如果df的大小很大,那麼這很重要。 – Vaishali

+0

非常整潔的答案! +1 – MaxU

1

使用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 
0

我喜歡使用一般的.apply

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

set的查找處於list