2017-10-20 10 views
2

は、私は失われたデータをたくさん持っているデータフレーム持っていると言うことができます最も完全な行を保つ私は新しいデータフレームを作成したいパンダは

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から1行しか含まれていませんが、その行は最も完全です(NaNの最小インスタンス)。しかし、同じように完了した場合は、現在のソート順で最初のオカレンスを返します。

Ideアル出力は、新たなデータフレームです:

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

答えて

2

サロゲート列を使用して、カウントに基づいてソートし、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 
+0

ah interesting。 2つの行に同じ 'count'がある場合、どの行を保持するかはどのように選択されますか? – Simon

+0

@Simon sort_valuesが期待どおりに実行されると仮定すると、最初の項目になります。 –

2

これは、私はするつもりです何drop_duplicatesである、あなたは@COLDSPEEDに触発さ.drop('Notnullvalue',1)

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 
0

を訴えによりNotnullvalueをドロップすることができ、私はそのような解決策を持っています。注:sort_valuesのデフォルト設定はna_position='last'です。

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