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

时间:2017-07-20 00:52:10

标签: python pandas dataframe

有点新手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)

1 个答案:

答案 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

这是你期望做的吗?