有點新的python,有這個算法,我試圖從df1中提取基於查找df2的值(它具有目標值)。Pandas Dataframe根據查找數據框中的值選擇行,然後根據列值選擇另一個條件
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
需要基於在DF2值DF1這意味着 在使用查找DF2爲COL [返回行是否爲COL [A,B]的值[C]是小於值[C] A,B]
因此,閱讀DF1 - 第1行 - 我得到a,b和c = 10 - 使用它來查找a,b在DF2中的限制,其中Col [c]的值爲15 - so將此行添加到新的DF ..但是當我讀取第4行是b,ac = 40,這更多是df2 [b,a] c = 15 - 對於該行如此錯誤。
所以返回DF應
df 1 A B C D a b 10 2 a a 20 4 a b 5 5 b a 10 1
我把它實現,但是看起來很簡陋,也有可能非常有效的兩種。任何建議..我希望能使用df1.apply和lambda但不是很確定如何。但是,如果有更好的方法可以提出您的意見。
此片段展示了我是如何能夠得到它的工作 - 而不是
__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)
您是否試圖在兩個數據框上進行連接? – Gayatri
你的解釋不清楚。請製作[mcve]。 –
@cᴏʟᴅsᴘᴇᴇᴅ我用示例代碼 – Abhi