例子:

row_number |id |firstname | middlename | lastname |
0          | 1 | John     | NULL       | Doe      |
1          | 1 | John     | Jacob      | Doe      |
2          | 2 | Alison   | Marie      | Smith    |
3          | 2 | NULL     | Marie      | Smith    |
4          | 2 | Alison   | Marie      | Smith    |

我试图找出如何按id分组,然后为每个groupby获取具有最少空值的行,删除包含最少空值的任何额外行是很好的(例如,删除第4行,因为它将第2行与id=2的最少空值绑定在一起)
这个例子的答案是行1和行2
最好是ansi sql,但是如果你能想到一种方法的话,我可以翻译其他语言(比如python和pandas)
编辑:
增加了一行以防打领带。

最佳答案

如果你想做这只熊猫,你可以这样做:

df[df.assign(NC = df.isnull().sum(1)).groupby('id')['NC'].transform(lambda x: x == x.min())]

输出:
   row_number  id firstname middlename lastname
1           1   1      John      Jacob      Doe
2           2   2    Alison      Marie    Smith

对于断路器:
添加行:
df.loc[4,['row_number','id','firstname','middlename','lastname']] = ['4',2,'Mary','Maxine','Maxwell']

然后使用groupbytransformidxmin
df[df.index == df.assign(NC = df.isnull().sum(1)).groupby('id')['NC'].transform('idxmin')]

输出:
  row_number id firstname middlename lastname
1          1  1      John      Jacob      Doe
2          2  2    Alison      Marie    Smith

关于python - 如何在groupby中选择空值最少的组?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49391838/

10-12 16:09