2016-09-20 7 views
3

Ich möchte Dezimalwerte vergleichen, die in zwei Spalten von Pandas Datenrahmen verfügbar sind.Wie werden in Spalten des Pandas-Datenrahmens verfügbare Dezimalzahlen verglichen?

Ich habe einen Datenrahmen:

data = {'AA' :{0:'-14.35',1:'632.0',2:'619.5',3:'352.35',4:'347.7',5:'100'}, 
     'BB' :{0:'-14.3500',1:'632.0000',2:'619.5000',3:'352.3500',4:'347.7000',5:'200'} 
     } 
df1 = pd.DataFrame(data) 
print df1 

Datenrahmen sieht wie folgt aus:

 AA  BB 
0 -14.35 -14.3500 
1 632.0 632.0000 
2 619.5 619.5000 
3 352.35 352.3500 
4 347.7 347.7000 
5 100 200 

I AA und BB Spalten vergleichen möchten. Wie im obigen Datenrahmen gezeigt, sind die Werte beider Spalten gleich, mit Ausnahme der Zeile 5th. einziges Problem sind die abschließenden Nullen.

Wenn beide AA und BB Spalten gleich sind, dann möchte ich in dritten Spalte dieser Vergleich das Ergebnis als Result heißt True oder False.

Erwartetes Ergebnis:

 AA  BB Result 
0 -14.35 -14.35 True 
1 632.0 632.0  True 
2 619.5 619.5  True 
3 352.35 352.35 True 
4 347.7 347.7  True 
5 100 200  False 

Wie ich diese Dezimalzahlen vergleichen kann?

Antwort

2

Sie müssen Spalte float von astype gegossen und dann Spalten vergleichen, weil type von Werten in Spalten string ist. Verwenden Sie dann mask und als Bedingung verwendet boolean Spalt Result:

print (type(df1.ix[0,'AA'])) 
<class 'str'> 

print (type(df1.ix[0,'BB'])) 
<class 'str'> 

df1['Result'] = df1.AA.astype(float) == df1.BB.astype(float) 
df1.BB = df1.BB.mask(df1.Result,df1.AA) 
print (df1) 
     AA  BB Result 
0 -14.35 -14.35 True 
1 632.0 632.0 True 
2 619.5 619.5 True 
3 352.35 352.35 True 
4 347.7 347.7 True 
5  100  200 False 

Eine andere Lösung mit ix:

df1['Result'] = df1.AA.astype(float) == df1.BB.astype(float) 
df1.ix[df1.Result, 'BB'] = df1.AA 
print (df1) 
     AA  BB Result 
0 -14.35 -14.35 True 
1 632.0 632.0 True 
2 619.5 619.5 True 
3 352.35 352.35 True 
4 347.7 347.7 True 
5  100  200 False 

Timings:

#len(df) = 6k 
df1 = pd.concat([df1]*1000).reset_index(drop=True) 

In [31]: %timeit df1.ix[df1.Result, 'BB'] = df1.AA 
The slowest run took 4.88 times longer than the fastest. This could mean that an intermediate result is being cached. 
1000 loops, best of 3: 1.19 ms per loop 

In [33]: %timeit df1.BB = df1.BB.mask(df1.Result,df1.AA) 
1000 loops, best of 3: 900 µs per loop 
+0

@ jezrael- Bitte beachten Sie mein erwarteten Ergebnis. Wenn beide Spalten gleich sind, dann möchte ich BB-Spalte wie AA. – kit

+0

Sorry, gib mir eine Sekunde. – jezrael

+0

Bitte überprüfen Sie bearbeiten. – jezrael

Verwandte Themen