2016-04-13 57 views
1

我想知道是否有一種方法可以使用.ix創建多個條件。更具體地講,我想要做的是改變這一點:在pandas .ix中可以有兩個條件嗎?

In [66]: df_test 
Out[66]: 
     A   B   C   D   E 
0 -0.013863  False -0.546036 0.373015 1.002579 
1 1.275009   2 0.447672 -0.393775 -1.509525 
2 -0.517209   0 0.543322 2.434393 0.348002 
3 1.768921   0 -1.015705 1.121779 1.548792 
4 0.575418  NaN -1.803939 0.099772 0.508620 
5 0.722897 0.519641 0.435199 -0.059685 -0.585716 

其中:

In [67]: type(df_test.iloc[0,1]) 
Out[67]: bool 

In [68]: type(df_test.iloc[1,1]) 
Out[68]: str 

In [69]: type(df_test.iloc[2,1]) 
Out[69]: str 

In [70]: type(df_test.iloc[3,1]) 
Out[70]: int 

這樣:

 A   B   C   D   E 
0 -0.013863  NaN -0.546036 0.373015 1.002579 
1 1.275009   2 0.447672 -0.393775 -1.509525 
2 -0.517209   0 0.543322 2.434393 0.348002 
3 1.768921   0 -1.015705 1.121779 1.548792 
4 0.575418  NaN -1.803939 0.099772 0.508620 
5 0.722897 0.519641 0.435199 -0.059685 -0.585716 

看來,在位置[0,1][3,1]項目這兩個== False,結果,當我嘗試df_test.ix[df_test.B == False, 'B'] = np.nan這兩個項目都轉向NaN

當我嘗試df_test.ix[df_test.B == False and type(df_test.B) == bool, 'B'] = np.nan我得到以下錯誤:KeyError: 'cannot use a single bool to index into setitem'

任何想法,將不勝感激。

編輯

In [133]: df_test 
Out[133]: 
     A   B   C   D   E 
0 -0.013863  False   1 0.373015 1.002579 
1 1.275009   2 0.447672 -0.393775 -1.509525 
2 -0.517209   0   3 2.434393 0.348002 
3 1.768921   0  NaN 1.121779 1.548792 
4 0.575418  NaN -1.80394 0.099772 0.508620 
5 0.722897 0.519641 0.435199 -0.059685 -0.585716 
... 

In [134]: df_test.dtypes 
Out[134]: 
A float64 
B  object 
C  object 
D float64 
E float64 
dtype: object 

In [139]: type(df_test['B'][0]) 
Out[139]: bool 

In [140]: type(df_test['B'][1]) 
Out[140]: str 

In [141]: type(df_test['B'][2]) 
Out[141]: str 

In [142]: type(df_test['B'][3]) 
Out[142]: int 

In [143]: type(df_test['B'][4]) 
Out[143]: float 

In [144]: df_test['B'] == False 
Out[144]: 
0  True 
1 False 
2 False 
3  True 
4 False 
5 False 
6 False 
7 False 
8 False 
9 False 
Name: B, dtype: bool 

EDIT2 見下面這是怎麼複製

In [226]: df_test = pd.DataFrame(np.random.randn(5,5), columns=list('ABCDE')) 

In [227]: df_test 
Out[227]: 
     A   B   C   D   E 
0 0.609775 0.205708 -0.015081 2.096414 0.121245 
1 1.223234 -1.299398 1.238649 0.216846 -0.789828 
2 0.446873 1.734404 -0.675568 -1.203400 0.053905 
3 0.286693 -0.080294 -0.115739 -0.195039 0.400201 
4 0.519230 1.939370 -0.424466 0.102137 -0.724420 

In [228]: df_test.iloc[0,1] = False 

In [229]: df_test.iloc[1,1] = '0' 

In [230]: df_test.iloc[2,1] = 0 

In [231]: df_test.iloc[3,1] = '2' 

In [232]: df_test.B == False 
Out[232]: 
0  True 
1 False 
2  True 
3 False 
4 False 
Name: B, dtype: bool 
+0

我不能重現這一點,因爲你的代碼如預期的那樣工作,如果你做了'df ['B'] == False',你會得到一個布爾系列並且看到第一個條目是'True' – EdChum

+0

如果'0'的類型是int,並且是。 'False == 0'。這就是爲什麼我試圖在這裏引入類型檢查以避免將'0'視爲'False'。 – Thanos

+0

對不起,我仍然無法重現這一點,編輯你的問題,顯示'df ['B'] ==假'返回 – EdChum

回答

1

這行代碼你想要做什麼。它的地圖是Falsenp.nan值:

df_test['B'] = df_test['B'].map(lambda x:np.nan if x == False else x) 

編輯:

一個更好的辦法就是

df[df == False] = np.nan 

實際的解決方案

後一些汗水,似乎多map()和以下工作正常:

df_test['B'] = df_test['B'].map(lambda x: np.nan if ((type(x) == bool) & (x == False)) else x) 
+0

謝謝,但它並沒有真正解決類型匹配問題。另外,您的第二個建議不僅限於'B'列,但它對數據框的所有列都有影響。 – Thanos

+0

正確的,這是在你的數據框的剪貼板副本上工作的,它不會導致不同的類型。是否有可能使用具有多個條件的map-technique,檢查類型以及x == False? – sulkeh

+0

是的,'map()'中的多個條件似乎工作正常。我建議編輯。 – Thanos

相關問題