将一列熊猫数据框与整数进行比较时,如何使用np.nanmin?

时间:2020-05-12 14:55:56

标签: python pandas numpy

import pandas as pd
import numpy as np
a = np.array([[1, 2], [3, np.nan]])
np.nanmin(a, axis=0)
array([1.,  2.])

我想在pandas数据框列上使用相同的逻辑,并将列的每个值与整数进行比较。

用例:

MC_cond = df['MODEL'].isin(["MC"])
df_lgd_type = df['LGD_TYPE'].isin(["FIXED"])
df_without_lgd_type = ~(df_lgd_type)

x = np.nanmin((1,df.loc[MC_cond & df_without_lgd_type,'A'] + df.loc[MC_cond & 
    df_without_lgd_type,'B']))

比较A列和B列的总和为1。

1 个答案:

答案 0 :(得分:0)

即使没有np.nanmin,这也可以解决问题。我希望我从您的稀疏描述中正确理解了所有内容。

我假设您还想替换求和后剩下的NaN值。因此,我们用1填充了这些值,然后将所有值裁剪为1处的最大值。

a = df.loc[MC_cond & df_without_lgd_type, 'A']
b = df.loc[MC_cond & df_without_lgd_type, 'B']
x = (a + b).fillna(1).clip(upper=1)

示例:

df = pd.DataFrame({
    'A': [-1, np.nan, 2, 3, 4], 
    'B': [-4, 5, np.nan, 7, -8]
})

(df.A + df.B).fillna(1).clip(upper=1)

# Output:
# 0   -5.0
# 1    1.0
# 2    1.0
# 3    1.0
# 4   -4.0
# dtype: float64

如果您不希望一列中的NaN值导致行总和也为NaN,只需在以下位置填充它们即可:

x = (a.fillna(0) + b.fillna(0)).fillna(1).clip(upper=1)

仅出于完整性考虑,这将是一个纯粹的 numpy 解决方案,类似于您的方法:

a = df.loc[MC_cond & df_without_lgd_type, 'A'].to_numpy()
b = df.loc[MC_cond & df_without_lgd_type, 'B'].to_numpy()

# optionally fill NaNs with 0
# a = np.nan_to_num(a)
# b = np.nan_to_num(b)

s = a + b
x = np.nanmin(np.stack(s, np.ones_like(s))), axis=0)
相关问题