2017-07-20 4 views
1

Etwas neu zu Python, Habe dieses Algo, wo ich versuche, Werte von DF1 basierend auf dem Lookup df2 zu extrahieren (die die Zielwerte hat).Pandas Dataframe Wählen Sie Zeilen basierend auf Werten aus einem Lookup-Datenframe und dann eine andere Bedingung basierend auf Spaltenwert

 
df 1 
A  B  C D 
a  b  10 2 
a  a  20 4 
b  a  40 10 
a  b  5 5 
b  a  10 1 
 
df 2 
A  B  C 
a  b  15 
a  a  30 
b  a  20 
z  x  5 
x  y  10 

benötigen Zeilen aus df1 auf Wert in DF2 basierend zurückzukehren, die bedeutet, wenn für col [A, B] Wert [C] ist kleiner als der Wert [C] in lookup DF2 für col [unter Verwendung von A, B]

Also, lesen DF1 - Zeile 1 - ich bekomme a, b und c = 10 - verwenden Sie das nachschlagen Grenze für a, b in DF2, wo ich Wert von Col [c] als 15 - so erhalten füge diese Zeile zu dem neuen DF hinzu. Aber wenn ich Zeile 4 lese, die b ist, dann ac = 40, was mehr ist als df2 [b, a] c = 15 - so falsch für diese Zeile.

So ist die Rückkehr df sollte

 
df 1 
A  B  C D 
a  b  10 2 
a  a  20 4 
a  b  5 5 
b  a  10 1 

sein Ich habe es umgesetzt aber sieht ziemlich rudimentär und nicht sehr effizient entweder sein. Irgendwelche Vorschläge .. Ich hatte gehofft, die df1.apply und lambda zu benutzen, aber nicht sehr sicher wie. Aber wenn es einen besseren Weg gibt, würden Sie gerne Ihre Kommentare hören.

Dieser Code-Schnipsel zeigt, wie ich es an die Arbeit konnte - die optimale Lösung nicht

 __sdf = pd.DataFrame({'A': list('aaabbbcccc'), 'B': list('ababsbcdcd'), 'c': range(10), 'd': range(0, 20, 2), 
           'g': [1] * 3 + [2] * 3 + [3] * 4}) 
     print "orig : \n {0}".format(__sdf) 
     __qf = pd.DataFrame({'A': list('aaabbczz'), 'B': list('abybsdxy'), 'c': list('23567894')}) 
     print "qf : \n {0}".format(__qf) 
     keys = ['A', 'B'] 
     col_c = 'c' 
     i1 = __sdf.set_index(keys).index 
     i2 = __qf.set_index(keys).index 
     __relevant_qf = __qf[i2.isin(i1)] 
     print "relevant qf : \n {0}".format(__relevant_qf) 

     i10 = __sdf.set_index(keys).index 
     __new_df = pd.DataFrame() 
     for idx, row in __relevant_qf.iterrows(): 
      data = [] 
      __q_val = float(row['c']) 
      data.append(row[keys]) 
      __res_df = pd.DataFrame(data) 
      i20 = __res_df.set_index(keys).index 
      __sub_df = __sdf[i10.isin(i20)] 
      print "__sub_df : \n {0}".format(__sub_df) 
      __sub_df = __sub_df.loc[__comp(__sub_df[col_c], __q_val)] 
      print "filtered __sub_df : \n {0}".format(__sub_df) 
      __new_df = __new_df.append(__sub_df) 
     print "__new_df : \n {0}".format(__new_df) 
+0

Versuchen Sie, einen Join auf den beiden Datenrahmen durchzuführen? – Gayatri

+0

Ihre Erklärung ist nicht klar. Bitte mach ein [mcve]. –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ Ich aktualisierte es mit dem Beispielcode – Abhi

Antwort

0

ich Ihnen meinen Input gebe das Ergebnis basierend auf Sie erwarten zu sehen:

Was könnten Sie Do wird zusammengeführt und danach gefiltert.

data = pd.merge(df1,df2,on=['A','B']) 
data = data[data['C_x']<data['C_y']] 
data = data[['A','B','C_x','D']] 

Ergebnis:

A B C_x D 
0 a b 10 2 
1 a b 5 5 
2 a a 20 4 
4 b a 10 1 

Ist das, was Sie zu tun erwartet hatten?

+0

Dank @Gayatri. Aus irgendeinem Grund funktioniert der Filter nicht für mich - Daten = Daten [Daten ['C_x'] Abhi

+0

Kannst du die Spalten C_x und C_y nach der Zusammenführung sehen? – Gayatri

+0

Überprüfen Sie auch die Datentypen der Spalten, wenn sie int64 sind. – Gayatri

Verwandte Themen