2017-10-04 95 views
3

我试图创建一个新的df列,该列基于要在每行的所有其余列中进行验证的条件。对熊猫数据帧的每一列执行逻辑操作?

df = pd.DataFrame([[1, 5, 2, 8, 2], [2, 4, 4, 20, 5], [3, 3, 1, 20, 2], [4, 2, 2, 1, 0], 
        [5, 1, 4, -5, -4]], 
        columns=['a', 'b', 'c', 'd', 'e'], 
        index=[1, 2, 3, 4, 5]) 

我想:

df['f'] = "" 
df.loc[(df.any() >= 10), 'f'] = df['e'] + 10 

但是我得到:

IndexingError: Unalignable boolean Series key provided 

这是所需的输出:

a b c d e f 
1 1 5 2 8 2 
2 2 4 4 20 5 15 
3 3 3 1 20 2 12 
4 4 2 2 1 0 
5 5 1 4 -5 -4 
+0

Nan很好。谢谢 – hernanavella

回答

1

使用

In [984]: df.loc[(df >= 10).any(1), 'f'] = df['e'] + 10 

In [985]: df 
Out[985]: 
    a b c d e  f 
1 1 5 2 8 2 NaN 
2 2 4 4 20 5 15.0 
3 3 3 1 20 2 12.0 
4 4 2 2 1 0 NaN 
5 5 1 4 -5 -4 NaN 
1

需要注意的是:

df.any() 
a True 
b True 
c True 
d True 
e True 
f True 
dtype: bool 

df.any() >= 10 
a False 
b False 
c False 
d False 
e False 
f False 
dtype: bool 

我假设你要检查一列中的任何值>= 10。这将通过(df >= 10).any(axis=1)完成。


你应该能够做到这一步,使用np.where

df['f'] = np.where((df >= 10).any(axis=1), df.e + 10, '')  
df 
    a b c d e f 
1 1 5 2 8 2  
2 2 4 4 20 5 15 
3 3 3 1 20 2 12 
4 4 2 2 1 0  
5 5 1 4 -5 -4 

如果你喜欢NaN!而非空白,使用:

df['f'] = np.where((df >= 10).any(axis=1), df.e + 10, np.nan) 
df 
    a b c d e  f 
1 1 5 2 8 2 NaN 
2 2 4 4 20 5 15.0 
3 3 3 1 20 2 12.0 
4 4 2 2 1 0 NaN 
5 5 1 4 -5 -4 NaN 
1

通过使用max

df['f'] = "" 
df.loc[df.max(1)>=10,'f']=df.e+10 


Out[330]: 
    a b c d e f 
1 1 5 2 8 2  
2 2 4 4 20 5 15 
3 3 3 1 20 2 12 
4 4 2 2 1 0  
5 5 1 4 -5 -4