首页 > 解决方案 > 通过在熊猫组中添加连续数字来填充 NaN

问题描述

我有一个数据框,例如

Groups NAME Number
G1     A    1
G1     B    2
G1     D    NaN
G1     D    NaN 
G1     I    3
G1     H    NaN 
G2     E    1 
G2     E    1
G2     F    NaN
G2     J    2
G3     K    NaN
G3     L    1

我想通过完成数字来填充组内的 NaN 值

例如,因为 1,2 和 3 已经存在,所以DinG1得到了。Number 4然后 H inG1得到Number 5等...

在和我应该得​​到;

Groups NAME Number
G1     A    1
G1     B    2
G1     D    4
G1     D    4
G1     I    3
G1     H    5
G2     E    1 
G2     E    1
G2     F    3
G2     J    2
G3     K    2
G3     L    1

请问有人有想法吗?

标签: pythonpython-3.xpandas

解决方案


您可以使用groupby+ngroup将每个组/名称标记为具有递增整数的空值。然后我们减去ngroup组内的最小值(以确定要添加多少)并添加组内已经存在的最大值。

然后我们fillna用这个系列。

s = df[df['Number'].isnull()].groupby(['Groups', 'NAME']).ngroup()
#2     0      #<- G1/D  (Series index is DataFrame index)
#3     0      #<- G1/D  
#5     1      #<- G1/H 
#8     2      #<- G2/F
#10    3      #<- G3/K

to_fill = (s - s.groupby(df['Groups']).transform('min') + 1
           + df.groupby('Groups')['Number'].transform('max'))
#0     NaN
#1     NaN
#2     4.0
#3     4.0
#4     NaN
#5     5.0
#6     NaN
#7     NaN
#8     3.0
#9     NaN
#10    2.0
#11    NaN

df['Number'] = df['Number'].fillna(to_fill, downcast='infer')
#   Groups NAME  Number
#0      G1    A       1
#1      G1    B       2
#2      G1    D       4
#3      G1    D       4
#4      G1    I       3
#5      G1    H       5
#6      G2    E       1
#7      G2    E       1
#8      G2    F       3
#9      G2    J       2
#10     G3    K       2
#11     G3    L       1

推荐阅读