2017-12-06 1 views
0

Diese Frage trifft, ist eine Erweiterung dieses: Pandas: Calculating value of difference between current column value and next column value depending if it meets criteria at a different columnPandas: Berechnung Wert der Differenz zwischen dem aktuellen Spaltenwert und dem nächsten Spaltenwert je nachdem, ob es Kriterien in einer anderen Spalte

Zunächst ich zwischen jedem den Unterschied wissen wollte Position und die nächste Position, die in der Spalte foobar den entgegengesetzten Wert hat. Hier

ist ein Datenrahmen:

pd.DataFrame.from_items([('A', [10, 'foo']), ('B', [440, 'foo']), ('C', [790, 'bar']), ('D', [800, 'bar']), ('E', [7000, 'foo']), ('F', [14000, 'bar']), ('G', [27000, 'bar'])], orient='index', columns=['position', 'foobar']) 

die wie folgt aussieht:

position foobar 
A 10  foo 
B 440  foo 
C 790  bar 
D 800  bar 
E 7000  foo 
F 14000 bar 
G 27000 bar 

Jezrael eine ausgezeichnete Antwort bereitgestellt, um die Differenz zwischen jeder Position zu finden und der nächsten Position, die den entgegengesetzten Wert hat in die Foobar-Spalte, die Ausgabe produziert:

Allerdings was Ich würde jetzt gerne nach vorne und hinten schauen. So foo und sollte für die bar suchen, die die nächste Position ist, und nicht nur die nächste nach vorne (in der Spalte). So sollte die Ausgabe tatsächlich aussehen:

position foobar length 
A 10  foo  780 
B 440  foo  350 
C 790  bar  350 
D 800  bar  360 
E 7000  foo  6200 
F 14000 bar  7000 
G 27000 bar  20000 

Wie Sie mehrere der Längen sehen können, werden jetzt geändert, wie wir suchen nach oben und unten die foobar Spalte. Ich gebe zu, keine Ahnung zu haben, wie ich das machen soll.

Antwort

1

Ein Weg wäre, die vorherige Antwort auf den umgekehrt geordneten Datenrahmen anzuwenden und dann die Ergebnisse zu kombinieren.

# do solution from previous answer 
print(df) 

    position foobar difference 
A 10   foo  780.0 
B 440   foo  350.0 
C 790   bar  6210.0 
D 800   bar  6200.0 
E 7000  foo  7000.0 
F 14000  bar  NaN 
G 27000  bar  NaN 

# do the same thing on the reverse sorted df 
df2 = df.sort_values(by=['position'], ascending=False) 
a2 = df2['foobar'].ne(df2['foobar'].shift()).cumsum() 
b2 = df2.groupby(a2)['position'].first() 
df2['difference'] = a2.add(1).map(b2) - df2['position'] 
df2['difference'] *= -1 
df2 = df2.sort_values(by='position') 

print(df2) 

    position foobar difference 
A  10 foo   NaN 
B  440 foo   NaN 
C  790 bar  350.0 
D  800 bar  360.0 
E  7000 foo  6200.0 
F  14000 bar  7000.0 
G  27000 bar  20000.0 

# combine the two results 
df['difference'] = pd.concat([df['difference'], df2['difference']], axis=1).min(1) 

print(df) 

    position foobar difference 
A  10 foo  780.0 
B  440 foo  350.0 
C  790 bar  350.0 
D  800 bar  360.0 
E  7000 foo  6200.0 
F  14000 bar  7000.0 
G  27000 bar  20000.0 
+0

Vielen Dank. Das funktioniert perfekt und ist auch sehr gut erklärt. – spiral01

Verwandte Themen