Pandas保持最完整的行

wvyml7n5  于 2022-11-20  发布在  其他
关注(0)|答案(3)|浏览(154)

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

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

我希望创建一个新的 Dataframe ,其中仅包含每个id中的1行,但该行是最完整的(NaN的示例最少),但如果它们同样完整,则为当前排序顺序中的第一个匹配项
理想的输出是一个新的 Dataframe :

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有两个以上的条目时

4xrmg8kj

4xrmg8kj1#

您可以使用Surrogate数据行,根据计数进行排序,并使用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
g6baxovj

g6baxovj2#

这就是我要做的,drop_duplicates,您可以使用.drop('Notnullvalue', 1)来删除Notnullvalue

df['Notnullvalue'] = df.isnull().sum(1)
df.sort_values(['id', 'Notnullvalue']).drop_duplicates(['id'], keep='first')
Out[15]: 
  id   q1    q2   q3  Notnullvalue
0  a  1.0   low  NaN             1
4  b  0.0   low  0.0             0
5  c  NaN  high  0.0             1
6  d  1.0  high  1.0             0
9  e  0.0   low  NaN             1
7d7tgy0s

7d7tgy0s3#

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

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

相关问题