pandas 如何使用groupby填充nans并从另一个 Dataframe 填充值

m3eecexj  于 2022-12-02  发布在  其他
关注(0)|答案(3)|浏览(149)

我有一个输入 Dataframe (df1),其中包含Id、子id

df1 = pd.DataFrame({'Id': ['A1', 'A2', 'A3', 'B1', 'B2'], 
                'Subid':['A', 'A', 'A', 'B', 'B'], 
                'feature1':[2.6, 6.3, np.nan, np.nan, 3.3],
               'feature2':[55, np.nan, np.nan, 44, 69],
                'feature3':[np.nan, 0.5, 0.3, np.nan, np.nan],
                'feature4':[22, np.nan, 46, np.nan, 33],
                'feature5':[np.nan, np.nan, 52, np.nan, 53]
               })

我有另一个输入 Dataframe (df2),其中包含子ID和要填充的特征值。

df2 = pd.DataFrame({'Subid': ['A', 'B'],
                     'feature1': [2.966666666666667, 1.65],
                     'feature2': [18.333333333333332, 56.5],
                     'feature3': [0.26666666666666666, 0.0],
                     'feature4': [22.666666666666668, 16.5],
                     'feature5': [17.333333333333332, 26.5]})

我需要用df2中每个特性的值填充df1中的nans。我已经尝试了lambda和apply函数,但无法获得结果

df1.loc[df1['feature1'].isna(), 'feature1'] = df2.groupby('Subid')['feature1'].apply(lambda x:x)

预期输出:

outputdf = pd.DataFrame({'Id': ['A1', 'A2', 'A3', 'B1', 'B2'], 
                'Subid':['A', 'A', 'A', 'B', 'B'], 
                'feature1': [2.6, 6.3, 2.966667, 1.650000, 3.3],
                'feature2': [55, 18.333333, 18.333333, 44, 69],
                'feature3': [0.266667, 0.5, 0.3, 0.000000, 0.000000],
                'feature4': [22, 22.666667, 46, 16.500000, 33],
                'feature5': [17.333333, 17.333333, 52, 26.500000, 53]
               })

快速的帮助是感激的。

lvmkulzt

lvmkulzt1#

您可以在fillna之前使用merge

out = df1.fillna(df1[['Subid']].merge(df2, how='left'))

输出量:

Id Subid  feature1   feature2  feature3   feature4   feature5
0  A1     A  2.600000  55.000000  0.266667  22.000000  17.333333
1  A2     A  6.300000  18.333333  0.500000  22.666667  17.333333
2  A3     A  2.966667  18.333333  0.300000  46.000000  52.000000
3  B1     B  1.650000  44.000000  0.000000  16.500000  26.500000
4  B2     B  3.300000  69.000000  0.000000  33.000000  53.000000
rryofs0p

rryofs0p2#

您可以使用fillna填充np.nans值,并将第二个 Dataframe 与匹配的Subid合并

result = df1.fillna(df1[['Subid']].merge(df2, on='Subid', how='left'))
gpnt7bae

gpnt7bae3#

for f in [f for f in df1.columns if f.startswith('feature')]:
    df1[f]=df1[f].mask(pd.isnull, df1[['Subid']].merge(df2[['Subid', f]])[f])

退货:

Id Subid  feature1   feature2  feature3   feature4   feature5
0  A1     A  2.600000  55.000000  0.266667  22.000000  17.333333
1  A2     A  6.300000  18.333333  0.500000  22.666667  17.333333
2  A3     A  2.966667  18.333333  0.300000  46.000000  52.000000
3  B1     B  1.650000  44.000000  0.000000  16.500000  26.500000
4  B2     B  3.300000  69.000000  0.000000  33.000000  53.000000

相关问题