这是一个奇怪的例子:我有3个数据帧,“prov\u data”包含一个提供者id,并根据区域和类别进行计数(即,该提供者与这些区域和类别交互的次数)。你知道吗
prov_data = DataFrame({'aprov_id':[1122,3344,5566,7788],'prov_region_1':[0,0,4,0],'prov_region_2':[2,0,0,0],
'prov_region_3':[0,1,0,1],'prov_cat_1':[0,2,0,0],'prov_cat_2':[1,0,3,0],'prov_cat_3':[0,0,0,4],
'prov_cat_4':[0,3,0,0]})
“投标资料”,包含相同的投标资料。你知道吗
tender_data = DataFrame({'atender_id':['AA12','BB33','CC45'],
'ten_region_1':[0,0,1,],'ten_region_2':[0,1,0],
'ten_region_3':[1,1,0],'ten_cat_1':[1,0,0],
'ten_cat_2':[0,1,0],'ten_cat_3':[0,1,0],
'ten_cat_4':[0,0,1]})
最后一个“不匹配”DF包含了供应商和投标方之间禁止的匹配。你知道吗
no_match = DataFrame({ 'prov_id':[1122,3344,5566],
'tender_id':['AA12','BB33','CC45']})
我需要执行以下操作:创建一个新的df,如果prov\u data&tender\u data DataFrames的行(1)与一个或多个类别匹配(即同一类别为>;0),并且(2)与一个或多个地区匹配,并且(3)不在no\u匹配列表中,则该df将附加这些行。你知道吗
所以这会给我这个数据框:
df = DataFrame({'aprov_id':[1122,3344,7788],'prov_region_1':[0,0,0],'prov_region_2':[2,0,0],
'prov_region_3':[0,1,1],'prov_cat_1':[0,2,0],'prov_cat_2':[1,0,0],'prov_cat_3':[0,0,4],
'prov_cat_4':[0,3,0], 'atender_id':['BB33','AA12','BB33'],
'ten_region_1':[0,0,0],'ten_region_2':[1,0,1],
'ten_region_3':[1,1,1],'ten_cat_1':[0,1,0],
'ten_cat_2':[1,0,1],'ten_cat_3':[1,0,1],
'ten_cat_4':[0,0,0]})
只使用“标准”
pandas
技术的简单解决方案。你知道吗首先,我们对这两个数据帧做一个完全的交叉积,并将其与
no_match
数据帧合并,然后添加一个布尔列来标记要删除的所有行。你知道吗布尔列由两个布尔lambda函数指定,并带有所有必要的条件,然后我们只取该列为
False
的所有行。你知道吗由于合并操作,此解决方案对资源不太友好,因此如果您的数据非常大,则可能会对您不利。你知道吗
代码
解释
相关问题 更多 >
编程相关推荐