2017-07-10 22 views
3

ID番号が同じ(2行目と1行目など)の2行を比較して、絶対的収入の少ない行を削除したいと考えています。 .Itertuples()を使って行をループせず、パンダの関数だけを使ってこれを行うことができる方法はありますか?私は.shiftと.applyを使用することを考えていましたが、実行方法がわかりません。私が欲しいパンダのデータフレームの行を比較する方法

Index ID    Income 
0  2011000070  55019 
1  2011000070   0 
2  2011000074  23879 
3  2011000074   0 
4  2011000078   0 
5  2011000078   0 
6  2011000118  -32500 
7  2011000118   0 

出力:

Index ID    Income 
0  2011000070  55019  
2  2011000074  23879  
4  2011000078   0  
6  2011000118  -32500 

答えて

3

あなたはlocで行を選択し、最大絶対値のインデックスのためにSeries.absDataFrameGroupBy.idxmaxを必要と:

print (df.groupby('ID')['Income'].apply(lambda x: x.abs().idxmax())) 
ID 
2011000070 0 
2011000074 2 
2011000078 4 
2011000118 6 
Name: Income, dtype: int64 

df = df.loc[df.groupby('ID')['Income'].apply(lambda x: x.abs().idxmax())] 
print (df) 
    Index   ID Income 
0  0 2011000070 55019 
2  2 2011000074 23879 
4  4 2011000078  0 
6  6 2011000118 -32500 

代替ソリューション:

df = df.loc[df['Income'].abs().groupby(df['ID']).idxmax()] 
print (df) 
    Index   ID Income 
0  0 2011000070 55019 
2  2 2011000074 23879 
4  4 2011000078  0 
6  6 2011000118 -32500 
1

pandas.DataFrame.drop_duplicatesを使用して、プラスIDによってソートやIncomeの絶対値があなたの問題を解決する必要があります。そのkeepパラメータはデフォルトで"first"になります。

df['Income_abs'] = df['Income'].apply(abs) 

df.sort_values(['ID', 'Income_abs'], ascending=[True,False]).drop_duplicates(['ID']).drop('Income_abs',axis=1) 
Out[26]: 
    Index   ID Income 
0  0 2011000070 55019 
2  2 2011000074 23879 
4  4 2011000078  0 
6  6 2011000118 -32500 
1

これは仕事ができます。

In [458]: df.groupby('ID', as_index=False).apply(lambda x: x.ix[x.Income.abs().idxmax()]) 
Out[458]: 
    Index   ID Income 
0  0 2011000070 55019 
1  2 2011000074 23879 
2  4 2011000078  0 
3  6 2011000118 -32500 
関連する問題