问题描述
ValsHR
我有一个数据框 valsHR=[78.8,82.3,91.0]
MainData
我想填充 NaN,以便 valsHR 中的第一个值只填充患者 1 的 NaN,第二个值填充患者 2 的 NaN,第三个值填充患者 3。
到目前为止我已经尝试过使用这个:
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。
我也试过使用这个:
mainData['HR'] = mainData['HR'].fillna(ValsHR)
用根本不在 mainData['HR'] = mainData.groupby('Patient').fillna(ValsHR)
向量中的值填充 NaN。
我想知道是否有人知道这样做的方法?
解决方法
通过 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(),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
,
它只是映射,如果所有的NaN
都应该被替换
import pandas as pd
from io import StringIO
valsHR=[78.8,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