Ich habe eine CSV
Datei von monatlichen Handy Rechnungen in keiner bestimmten Reihenfolge, die ich in eine Pandas
Dataframe
lesen. Ich möchte für jede Rechnung eine Spalte hinzufügen, die angibt, wie stark sie sich von der vorherigen Rechnung für dasselbe Konto unterscheidet. Diese CSV ist nur eine Untermenge meiner Daten. Mein Code funktioniert gut, ist aber ziemlich schlampig und sehr langsam, wenn Sie eine CSV-Datei in der Nähe von einer Million Zeilen betrachten.Effizientes Vergleichen von Daten über Zeilen in einem Pandas Datareframe
Was soll ich tun, um dies effizienter zu machen?
CSV:
Account Number,Bill Month,Bill Amount
4543,3/1/2015,300
4543,1/1/2015,100
4543,2/1/2015,200
2322,1/1/2015,22
2322,3/1/2015,38
2322,2/1/2015,25
Python:
import numpy as np
import pandas as pd
data = pd.read_csv('data.csv', low_memory=False)
# sort my data and reset the index so I can use index and index - 1 in the loop
data = data.sort_values(by=['Account Number', 'Bill Month'])
data = data.reset_index(drop=True)
# add a blank column for the difference
data['Difference'] = np.nan
for index, row in data.iterrows():
# special handling for the first row so I don't get negative indexes
if index == 0:
data.ix[index, 'Difference'] = "-"
else:
# if the account in the current row and the row before are the same, then compare Bill Amounts
if data.ix[index, 'Account Number'] == data.ix[index - 1, 'Account Number']:
data.ix[index, 'Difference'] = data.ix[index, 'Bill Amount'] - data.ix[index - 1, 'Bill Amount']
else:
data.ix[index, 'Difference'] = "-"
print data
gewünschte Ausgabe:
Account Number Bill Month Bill Amount Difference
0 2322 1/1/2015 22 -
1 2322 2/1/2015 25 3
2 2322 3/1/2015 38 13
3 4543 1/1/2015 100 -
4 4543 2/1/2015 200 100
5 4543 3/1/2015 300 100
Danke, das ist so sauber! Können Sie eine kurze Erklärung hinzufügen, wie 'df.diff()' weiß, welche Werte zu subtrahieren sind und wann 'fillna()' – user2242044
@ user2242044 gilt, habe ich eine Erklärung zu meiner Antwort hinzugefügt - bitte überprüfen Sie – MaxU
Danke für die explanation – user2242044