我想知道是否有一種方法可以使用.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
我不能重現這一點,因爲你的代碼如預期的那樣工作,如果你做了'df ['B'] == False',你會得到一個布爾系列並且看到第一個條目是'True' – EdChum
如果'0'的類型是int,並且是。 'False == 0'。這就是爲什麼我試圖在這裏引入類型檢查以避免將'0'視爲'False'。 – Thanos
對不起,我仍然無法重現這一點,編輯你的問題,顯示'df ['B'] ==假'返回 – EdChum