是否有可能在pandas .ix中有两个条件?

时间:2016-04-13 15:54:56

标签: python pandas dataframe

我想知道是否有办法让.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时,这两个项目都转为{ {1}}。

当我尝试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'

EDIT2 请参阅下文如何复制

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

1 个答案:

答案 0 :(得分:1)

这行代码可以满足您的需求。它会将False的值映射到np.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)