Python 迭代两个数据帧并在多个条件下提供最小秩

Python 迭代两个数据帧并在多个条件下提供最小秩,python,pandas,for-loop,Python,Pandas,For Loop,我想迭代两个数据帧,一个是大数据帧(具有多个列和非null cols值),另一个是小数据帧(具有一些公共cols和null值) 大数据框是具有所有属性的实际客户数据,另一个是排名数据。我试图将最低等级标记为所有客户,并将其与排名数据进行比较 更大的数据帧如下所示- CUST_ID,DTL1,DTL2,DTLS3,AGE_BAND,SCORE,STATE,ATTR_1,ATTR_2,ATTR_3 1,xx,xx,xx,A1,S1,MH,1,1,6 2,xx,xx,xx,A1,S2,MH,1,2,7

我想迭代两个数据帧,一个是大数据帧(具有多个列和非null cols值),另一个是小数据帧(具有一些公共cols和null值)

大数据框是具有所有属性的实际客户数据,另一个是排名数据。我试图将最低等级标记为所有客户,并将其与排名数据进行比较

更大的数据帧如下所示-

CUST_ID,DTL1,DTL2,DTLS3,AGE_BAND,SCORE,STATE,ATTR_1,ATTR_2,ATTR_3
1,xx,xx,xx,A1,S1,MH,1,1,6
2,xx,xx,xx,A1,S2,MH,1,2,7
3,xx,xx,xx,A2,S3,GJ,2,2,7
4,xx,xx,xx,A3,S1,RJ,1,2,6
5,xx,xx,xx,A2,S1,GJ,2,1,6
6,xx,xx,xx,A3,S3,RJ,1,2,7
以及排名数据-

Rank,AGE_BAND,SCORE,STATE,ATTR_1,ATTR_2
1,A1,S1,MH,Null,Null
2,A1,Null,MH,Null,1
3,Null,S1,GJ,Null,1
4,Null,S1,GJ,2,Null
这里,如果我们看到,那么cust_1满足秩-1和秩-2,但我们会选择最小值,即1。排名第三的Cust_5也是如此。

我尝试创建一个嵌套的for循环;外部循环遍历大数据帧,内部循环遍历小数据帧,但是我有困难

我正在寻找一种方法来确定我的小数据帧中的“col_name”和“value”在不为null时与我的大数据帧匹配,然后为其分配最小秩

我试着写一些东西如下:

for cust in Data_Cust.iterrows():       
    for rank in Data_rank.iterrows():       #if we can eliminate columns where its value are null for individual rank
        if rank.col_name == cust.col_name && rank.col_value == cust.value  ##something from which we can match col/val name with col/value name of both dfs
        
            #create a list and appended all eligible ranks
            #selecting minimun rank at the end
            #appending list and min rank in Data_cust 

您可以使用矩阵比较进行快速匹配,并使用加权系统对列的顺序进行优先级排序(可选)

结果:

[1, 1, 3, 1, 3, 1]

一种方法是创建一个序列,将列中的值映射到该值的最小秩。接下来,使用该系列为客户映射行上的值

cols=['AGE_BAND', 'SCORE', 'STATE']
m = pd.concat([df_rank[[i, 'Rank']].replace('Null', np.nan).drop_duplicates([i], keep='first').dropna()\
       .set_index(i)['Rank'] for i in cols])
m 
那么

输出:

         AGE_BAND  SCORE  STATE
CUST_ID                        
1             1.0    1.0    1.0
2             1.0    NaN    1.0
3             NaN    NaN    3.0
4             NaN    1.0    NaN
5             NaN    1.0    3.0
6             NaN    NaN    NaN
每个客户的最低排名:

CUST_ID
1    1.0
2    1.0
3    3.0
4    1.0
5    3.0
6    NaN
dtype: float64

展示你的工作/代码和你做了什么,以及你的预期输出。我目前还不能编写完整的可执行代码,但正在尝试构建类似于前面提到的东西@JimmarI不太清楚你想做什么。您需要一种方法来比较df1中的每个成员和df2中的每个成员,然后计算出最佳结果吗?@MLAlex这是正确的!当不为null时,应将df1中的每个成员与df2进行比较,然后选择最小秩。您可以尝试使用嵌套的应用函数。例如,在第一列上使用.apply一次获取每个成员,然后在另一列上使用apply函数。因此,您可以将column1的第一个成员与column2的每个成员进行比较,然后获得column1的下一个成员。
         AGE_BAND  SCORE  STATE
CUST_ID                        
1             1.0    1.0    1.0
2             1.0    NaN    1.0
3             NaN    NaN    3.0
4             NaN    1.0    NaN
5             NaN    1.0    3.0
6             NaN    NaN    NaN
CUST_ID
1    1.0
2    1.0
3    3.0
4    1.0
5    3.0
6    NaN
dtype: float64