有点新手python,我想尝试根据查找df2(具有目标值)从df1中提取值。
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中的行,这意味着 如果col [A,B]值[C]小于值[C],则使用查找df2作为col [A,B]
因此,读取DF1 - 第1行 - 我得到a,b和c = 10 - 使用它来查找DF2中a,b的限制,其中我得到Col [c]的值为15 - 所以将此行添加到新的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)
答案 0 :(得分:0)
我根据你期望看到的结果给你我的输入:
你可以做的就是合并然后过滤它。
data = pd.merge(df1,df2,on=['A','B'])
data = data[data['C_x']<data['C_y']]
data = data[['A','B','C_x','D']]
<强>结果强>:
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
这是你期望做的吗?