2017-07-10 4 views
3

Ich möchte 2 Zeilen vergleichen, wo die ID-Nummern identisch sind (z. B. Zeilen 0 und 1) und löschen Sie dann die Zeile mit dem kleineren absoluten Einkommen. Gibt es eine Möglichkeit, dies nur mit Pandas Funktionen und nicht durch die Zeilen mit .itertuples(). Ich dachte daran, .shift und .apply zu verwenden, aber ich bin mir nicht sicher, wie ich es ausführen soll.So vergleichen Sie Zeilen in einem Datenrahmen in Pandas

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 

Ausgang Ich möchte:

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

Antwort

3

Sie müssen DataFrameGroupBy.idxmax mit Series.abs für Indizes von max absoluten Werte und wählen Sie dann Reihen von loc:

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 

Alternative Lösung:

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 Verwendung sowie die Sortierung nach ID und der Absolutwert von Income sollte Ihr Problem lösen. Sein keep Parameter ist standardmäßig "first", was Sie wollen.

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

Diese funktionieren könnte.

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 
Verwandte Themen