Python 熊猫保持最完整的一排

Python 熊猫保持最完整的一排,python,pandas,missing-data,pandas-groupby,Python,Pandas,Missing Data,Pandas Groupby,假设我有一个数据框,其中有很多缺失的数据: df = pd.DataFrame({'id': ['a','a','b','b','b','c','d','e','e','e'], 'q1': [1,1,np.NaN,np.NaN,0,np.NaN,1,np.NaN,1,0], 'q2': ['low',np.NaN,np.NaN,'high','low','high','high',np.NaN,np.NaN,'low'

假设我有一个数据框,其中有很多缺失的数据:

df = pd.DataFrame({'id': ['a','a','b','b','b','c','d','e','e','e'],
                   'q1': [1,1,np.NaN,np.NaN,0,np.NaN,1,np.NaN,1,0],
                   'q2': ['low',np.NaN,np.NaN,'high','low','high','high',np.NaN,np.NaN,'low'],
                   'q3': [np.NaN,1,np.NaN,1,0,0,1,0,np.NaN,np.NaN]
                   })
看起来是这样的:

  id   q1    q2   q3
0  a  1.0   low  NaN
1  a  1.0   NaN  1.0
2  b  NaN   NaN  NaN
3  b  NaN  high  1.0
4  b  0.0   low  0.0
5  c  NaN  high  0.0
6  d  1.0  high  1.0
7  e  NaN   NaN  0.0
8  e  1.0   NaN  NaN
9  e  0.0   low  NaN
我想创建一个新的数据框,其中每个
id
只包含一行,但该行是最完整的(NaN的实例最少),但如果它们同样完整,则在当前排序顺序中第一次出现

理想的输出是一个新的数据帧:

  id   q1    q2   q3
0  a  1.0   low  NaN
1  b  0.0   low  0.0
2  c  NaN  high  0.0
3  d  1.0  high  1.0
4  e  0.0   low  NaN

我可以使用
df.isnull().sum(axis=1)
来计算每行中NA的数量,但我不确定如何使用它来选择总和最小的行,特别是如果
id

有两个以上的条目,您可以使用代理列根据计数进行排序,并使用
groupby
进行筛选

df = df.assign(count=df.isnull().sum(1))\
       .sort_values(['id', 'count'])\
       .groupby('id', as_index=0).head(1)\
       .drop('count', 1)

print(df)
  id   q1    q2   q3
0  a  1.0   low  NaN
4  b  0.0   low  0.0
5  c  NaN  high  0.0
6  d  1.0  high  1.0
9  e  0.0   low  NaN

这就是我要做的,
drop\u duplicates
,您可以通过起诉
.drop('Notnullvalue',1)
来删除
Notnullvalue


受@COLDSPEED的启发,我有了这样一个解决方案。注意
na_position='last'
sort_value
中的默认设置

df.sort_values(by=['q1','q2','q3'], na_position='last').groupby('id').head(1).sort_index()

啊,有趣。如果两行具有相同的
计数
,该如何选择保留哪一行?@Simon假设sort_值按预期执行,它应该是第一项。
df.sort_values(by=['q1','q2','q3'], na_position='last').groupby('id').head(1).sort_index()