Python 迭代两个数据帧并在多个条件下提供最小秩
我想迭代两个数据帧,一个是大数据帧(具有多个列和非null cols值),另一个是小数据帧(具有一些公共cols和null值) 大数据框是具有所有属性的实际客户数据,另一个是排名数据。我试图将最低等级标记为所有客户,并将其与排名数据进行比较 更大的数据帧如下所示-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
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