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)
Versuchen Sie, einen Join auf den beiden Datenrahmen durchzuführen? – Gayatri
Ihre Erklärung ist nicht klar. Bitte mach ein [mcve]. –
@ cᴏʟᴅsᴘᴇᴇᴅ Ich aktualisierte es mit dem Beispielcode – Abhi