如何使用每个向量条目来填充数据帧中单独组的 NAN

How to use each vector entry to fill NAN's of a separate groups in a dataframe

假设我有一个向量 ValsHR,它看起来像这样:

valsHR=[78.8, 82.3, 91.0]

我有一个数据框MainData

Age  Patient  HR             
21   1        NaN
21   1        NaN
21   1        NaN
30   2        NaN
30   2        NaN
24   3        NaN
24   3        NaN
24   3        NaN 

我想填充 NaN,这样 valsHR 中的第一个值将只填充患者 1 的 NaN,第二个将填充患者 2 的 NaN,第三个将填充患者 3。

到目前为止我试过使用这个: mainData['HR'] = mainData['HR'].fillna(ValsHR) 但它用向量中的第一个值填充所有 NaN。

我也试过用这个: mainData['HR'] = mainData.groupby('Patient').fillna(ValsHR) 用根本不在 valsHR 向量中的值填充 NaN。

我想知道是否有人知道这样做的方法?

就是简单的映射,如果NaN全部替换掉​​

import pandas as pd
from io import StringIO


valsHR=[78.8, 82.3, 91.0]
vals = {i:k for i,k in enumerate(valsHR, 1)}

df = pd.read_csv(StringIO("""Age  Patient             
21   1
21   1
21   1
30   2
30   2
24   3
24   3
24   3"""), sep="\s+")


df["HR"] = df["Patient"].map(vals)

>>> df
   Age  Patient    HR
0   21        1  78.8
1   21        1  78.8
2   21        1  78.8
3   30        2  82.3
4   30        2  82.3
5   24        3  91.0
6   24        3  91.0
7   24        3  91.0

通过 Patient 个具有缺失值的值创建字典,map 到原始列并仅替换缺失值:

print (df)
   Age  Patient     HR
0   21        1    NaN
1   21        1    NaN
2   21        1    NaN
3   30        2  100.0 <- value is not replaced
4   30        2    NaN
5   24        3    NaN
6   24        3    NaN
7   24        3    NaN


p = df.loc[df.HR.isna(), 'Patient'].unique()
valsHR = [78.8, 82.3, 91.0]

df['HR'] = df['HR'].fillna(df['Patient'].map(dict(zip(p, valsHR))))
print (df)
   Age  Patient     HR
0   21        1   78.8
1   21        1   78.8
2   21        1   78.8
3   30        2  100.0
4   30        2   82.3
5   24        3   91.0
6   24        3   91.0
7   24        3   91.0

如果某些组没有 NaN:

print (df)
   Age  Patient     HR
0   21        1    NaN
1   21        1    NaN
2   21        1    NaN
3   30        2  100.0 <- group 2 is not replaced
4   30        2  100.0 <- group 2 is not replaced
5   24        3    NaN
6   24        3    NaN
7   24        3    NaN


p = df.loc[df.HR.isna(), 'Patient'].unique()
valsHR = [78.8, 82.3, 91.0]

df['HR'] = df['HR'].fillna(df['Patient'].map(dict(zip(p, valsHR))))
print (df)
   Age  Patient     HR
0   21        1   78.8
1   21        1   78.8
2   21        1   78.8
3   30        2  100.0
4   30        2  100.0
5   24        3   82.3
6   24        3   82.3
7   24        3   82.3