Pandas element-wise min max对着沿一个轴的系列

Zha*_*g18 11 max min dataframe pandas elementwise-operations

我有一个Dataframe:

df = 
             A    B    C    D
DATA_DATE
20170103   5.0  3.0  NaN  NaN
20170104   NaN  NaN  NaN  1.0
20170105   1.0  NaN  2.0  3.0
Run Code Online (Sandbox Code Playgroud)

我有一个系列

s = 
DATA_DATE
20170103    4.0
20170104    0.0
20170105    2.2
Run Code Online (Sandbox Code Playgroud)

我想运行一个逐元素的max()函数并s沿着列的对齐df.换句话说,我想得到

result = 
             A    B    C    D
DATA_DATE
20170103   5.0  4.0  NaN  NaN
20170104   NaN  NaN  NaN  1.0
20170105   2.2  NaN  2.2  3.0
Run Code Online (Sandbox Code Playgroud)

做这个的最好方式是什么?我检查了单列比较系列到系列的比较,但没有找到一种有效的方法来对一系列运行数据帧.

奖励:不知道答案是不言而喻的上面,但如何做到这一点,如果我要对齐s沿df(假设尺寸匹配)?

Max*_*axU 8

数据:

In [135]: df
Out[135]:
             A    B    C    D
DATA_DATE
20170103   5.0  3.0  NaN  NaN
20170104   NaN  NaN  NaN  1.0
20170105   1.0  NaN  2.0  3.0

In [136]: s
Out[136]:
20170103    4.0
20170104    0.0
20170105    2.2
Name: DATA_DATE, dtype: float64
Run Code Online (Sandbox Code Playgroud)

解:

In [66]: df.clip_lower(s, axis=0)
C:\Users\Max\Anaconda4\lib\site-packages\pandas\core\ops.py:1247: RuntimeWarning: invalid value encountered in greater_equal
  result = op(x, y)
Out[66]:
             A    B    C    D
DATA_DATE
20170103   5.0  4.0  NaN  NaN
20170104   NaN  NaN  NaN  1.0
20170105   2.2  NaN  2.2  3.0
Run Code Online (Sandbox Code Playgroud)

我们可以使用以下hack来消除RuntimeWarning:

In [134]: df.fillna(np.inf).clip_lower(s, axis=0).replace(np.inf, np.nan)
Out[134]:
             A    B    C    D
DATA_DATE
20170103   5.0  4.0  NaN  NaN
20170104   NaN  NaN  NaN  1.0
20170105   2.2  NaN  2.2  3.0
Run Code Online (Sandbox Code Playgroud)


ayh*_*han 7

这称为广播,可以按如下方式进行:

import numpy as np
np.maximum(df, s[:, None])
Out: 
             A    B    C    D
DATA_DATE                    
20170103   5.0  4.0  NaN  NaN
20170104   NaN  NaN  NaN  1.0
20170105   2.2  NaN  2.2  3.0
Run Code Online (Sandbox Code Playgroud)

在这里,s[:, None]将添加一个新轴s.同样可以通过s[:, np.newaxis].当你这样做时,它们可以一起广播,因为形状(3, 4)(3, 1)共同元素.

需要注意的区别ss[:, None]:

s.values
Out: array([ 4. ,  0. ,  2.2])

s[:, None]
Out: 
array([[ 4. ],
       [ 0. ],
       [ 2.2]])

s.shape
Out: (3,)

s[:, None].shape
Out: (3, 1)
Run Code Online (Sandbox Code Playgroud)

另一种选择是:

df.mask(df.le(s, axis=0), s, axis=0)

Out: 
             A    B    C    D
DATA_DATE                    
20170103   5.0  4.0  NaN  NaN
20170104   NaN  NaN  NaN  1.0
20170105   2.2  NaN  2.2  3.0
Run Code Online (Sandbox Code Playgroud)

这包括:比较df和s.df较大时,使用df,否则使用s.