【问题标题】:Fill the NA value in one column according to values of similar columns [duplicate]根据相似列的值填写一列中的NA值[重复]
【发布时间】:2019-11-22 22:40:30
【问题描述】:

我想在给定值中填写 nan 的值,如下所示:

df = pd.DataFrame({'A' : ['aa', 'bb', 'cc', 'aa'], 
                   'B': ['xx', 'yy', 'zz','xx'], 
                   'C': ['2', '3','8', np.nan]})
print (df)

A  B  C
aa xx 2
bb yy 3
cc zz 8
aa xx NaN  

预期输出:

A  B  C
aa xx 2
bb yy 3
cc zz 8
aa xx 2

由于 A 列和 B 列在第三列中的值为 2,因此最后一行在 C 列中也应为 2。

【问题讨论】:

    标签: python pandas pandas-groupby nan


    【解决方案1】:

    先尝试 sort_values 使 Nan 在最后,然后通过 ffill() 使用 group by

    df.sort_values(by=['C'],inplace=True)
    df = df.groupby(['A','B']).ffill()
    
        A   B   C
    0   aa  xx  2
    1   bb  yy  3
    2   cc  zz  8
    3   aa  xx  2
    

    【讨论】:

    • 只有当NaNs 总是在组中时才能工作,所以通常不工作......
    • 是的,在这种情况下,我们需要先排序,所以 NaN 应该排在最后
    【解决方案2】:

    GroupBy.ffillDataFrame.sort_valuesDataFrame.sort_index 一起用于NaNs 到组的末尾:

    df['C'] = df.sort_values(['A','B','C']).groupby(['A','B'])['C'].ffill().sort_index()
    print (df)
        A   B  C
    0  aa  xx  2
    1  bb  yy  3
    2  cc  zz  8
    3  aa  xx  2
    

    每组向前和向后填充的另一种解决方案:

    df['C'] = df.groupby(['A','B'])['C'].apply(lambda x: x.ffill().bfill())
    

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 2020-04-10
      • 1970-01-01
      • 2016-05-13
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      相关资源
      最近更新 更多