如何 select groupby 中空值最少的组?
How do I select the group with the least number of null values in a groupby?
示例:
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 进行分组,然后为每个分组获取具有最少 NULL 值的行,删除任何包含最少 NULL 的额外行就可以了(例如, droping row_number 4 因为它与 row_number 2 联系在一起,因为 id=2)
的 NULLS 数量最少
这个例子的答案是 row_numbers 1 和 2
最好是 ANSI SQL,但我可以翻译其他语言(比如 python 和 pandas),如果你能想出办法的话
编辑:
为打破平局的情况添加了一行。
哦,您想要具有最少 null
值的行。我会建议:
select t.*
from (select t.*,
dense_rank() over (order by (case when firstname is null then 1 else 0 end) +
(case when middlename is null then 1 else 0 end) +
(case when lastname is null then 1 else 0 end)
) as seqnum
from t
) t
where seqnum = 1;
这是ANSI-standardSQL。
如果你想这样做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']
然后使用groupby
、transform
和idxmin
:
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
示例:
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 进行分组,然后为每个分组获取具有最少 NULL 值的行,删除任何包含最少 NULL 的额外行就可以了(例如, droping row_number 4 因为它与 row_number 2 联系在一起,因为 id=2)
的 NULLS 数量最少这个例子的答案是 row_numbers 1 和 2
最好是 ANSI SQL,但我可以翻译其他语言(比如 python 和 pandas),如果你能想出办法的话
编辑: 为打破平局的情况添加了一行。
哦,您想要具有最少 null
值的行。我会建议:
select t.*
from (select t.*,
dense_rank() over (order by (case when firstname is null then 1 else 0 end) +
(case when middlename is null then 1 else 0 end) +
(case when lastname is null then 1 else 0 end)
) as seqnum
from t
) t
where seqnum = 1;
这是ANSI-standardSQL。
如果你想这样做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']
然后使用groupby
、transform
和idxmin
:
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