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)
答
我给你我的输入根据该结果,你希望看到的最优解:
尽你所能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
难道这就是你期待吗?
您是否试图在两个数据框上进行连接? – Gayatri
你的解释不清楚。请制作[mcve]。 –
@cᴏʟᴅsᴘᴇᴇᴅ我用示例代码 – Abhi