2016-04-13 13 views
1

.ixで複数の条件を設定する方法があるのだろうかと思いました。パンダには2つの条件がありますか?

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'を実行した場合、あなたのコードは期待どおりに動作しますので、これを再現することはできません。ブール値のシリーズを取得し、 – EdChum

+0

'0'の型がintでない場合、それはです。 'False == 0'。このため、私は '0'を' False'として扱わないように型チェックを導入しようとしていたのです。 – Thanos

+0

私はまだこれを再現することができません。あなたの質問を編集して、 'df ['B'] == False'が返されます。 – EdChum

答えて

1

を再現する方法下記参照EDIT。それはnp.nanFalseである値をマップ:

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

ありがとうございますが、タイプマッチングの問題に実際には対処しません。また、2番目の提案は列 'B'に限定されませんが、データフレームのすべての列に影響します。 – Thanos

+0

これはあなたのデータフレームのクリップボードのコピーで動作しましたが、異なるタイプにはなりません。複数の条件でmap-techniqueを使用することは可能ですか?x == Falseと同様にタイプをチェックしますか? – sulkeh

+0

はい、 'map()'の中の複数の条件がうまくいくようです。私は編集を提案しています。 – Thanos

関連する問題