对pandas数据帧的每一列执行逻辑运算?

时间:2017-10-04 18:52:18

标签: python pandas dataframe

我尝试根据要在每行的所有其余列中验证的条件创建新的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

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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