[英]Pandas Dataframe Select rows based on values from a lookup dataframe and then another condition based on column value
Kinda是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],如果对col [A,B]使用查找df2,则value [C]小于value [C]
因此,请阅读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)
我根据您希望看到的结果向您提供意见:
您可以做的是合并,然后对其进行过滤。
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
这是您所期望的吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.