Pandas Dataframe根据查找数据框中的值选择行,然后根据列值选择另一个条件

问题描述:

有点新的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) 
+0

您是否试图在两个数据框上进行连接? – Gayatri

+0

你的解释不清楚。请制作[mcve]。 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ我用示例代码 – Abhi

我给你我的输入根据该结果,你希望看到的最优解:

尽你所能do是合并,然后过滤它。

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 

难道这就是你期待吗?

+0

更新了它,谢谢@Gayatri。由于某种原因,过滤器不适用于我 - data = data [data ['C_x'] Abhi

+0

你能看到合并后的列C_x和C_y吗? – Gayatri

+0

如果它们是int64,还检查列的数据类型。 – Gayatri