我如何根据 Pandas 中的条件排名

How can I rank based on condition in Pandas

假设,我有 Pandas DataFrame 如下所示:

Cluster Variable Group Ratio Value
1 GDP_M3 GDP 20% 70%
1 HPI_M6 HPI 40% 80%
1 GDP_lg2 GDP 35% 50%
2 CPI_M9 CPI 10% 50%
2 HPI_lg6 HPI 15% 65%
3 CPI_lg12 CPI 15% 90%
3 CPI_lg1 CPI 20% 95%

我想根据单独列中的 RatioValueVariable 进行排名。 Ratio 将从最低到最高排名,而 Value 将从最高到最低排名。

有些变量我不想排名。在示例中,我不喜欢 CPI。任何类型的 CPI 都不会考虑排名,例如 CPI_M9。但是,只有在 Cluster.

中只有那个特定变量时才会出现这种情况

上述条件的结果将类似于下面的 table:

Cluster Variable Group Ratio Value RankRatio RankValue
1 GDP_M3 GDP 20% 70% 1 2
1 HPI_M6 HPI 40% 80% 3 1
1 GDP_lg2 GDP 35% 50% 2 3
2 CPI_M9 CPI 10% 50% NaN NaN
2 HPI_lg6 HPI 15% 65% 1 1
3 CPI_lg12 CPI 15% 90% 1 2
3 CPI_lg1 CPI 20% 95% 2 1

对于群集 1,GDP_M320% 处具有最低的 Ratio,而 HPI_M380% 处具有最高的 Value ].因此,他们都将被分配到第 1 位,其他人将随后被分配。

对于集群 2,即使 CPI_M9 的比率最低,但 CPI 不是首选。因此,排名 1 将分配给 HPI_lg6.

对于集群 3,只有 CPI 组中有变量,没有其他选项可以排名。因此,CPI_lg12CPI_lg1是根据最低的Ratio和最高的Value进行排名的。

df['RankRatio'] = df.groupby(['Cluster'])['Ratio'].rank(method = 'first', ascending = True)
df['RankValue'] = df.groupby(['Cluster'])['Value'].rank(method = 'first', ascending = False)

我有一些代码只能处理一般情况,但对于具有不喜欢的变量组的特定情况,我的代码无法处理它。

请对此提供帮助或建议。谢谢。

使用:

#convert columns to numeric
df[['Ratio','Value']]=df[['Ratio','Value']].apply(lambda x: x.str.strip('%')).astype(float)

按条件删除具有 CPI 的行 - 测试行是否只有 CPI 每个 Cluster:

m = df['Group'].eq('CPI')
m1 = ~df['Cluster'].isin(df.loc[m, 'Cluster']) | m
df['RankRatio'] = df[m1].groupby('Cluster')['Ratio'].rank(method='first', ascending=True)
df['RankValue'] = df[m1].groupby('Cluster')['Value'].rank(method='first', ascending=False)


print (df)
   Cluster  Variable Group  Ratio  Value  RankRatio  RankValue
0        1    GDP_M3   GDP   20.0   70.0        1.0        2.0
1        1    HPI_M6   HPI   40.0   80.0        3.0        1.0
2        1   GDP_lg2   GDP   35.0   50.0        2.0        3.0
3        2    CPI_M9   CPI   10.0   50.0        NaN        NaN
4        2   HPI_lg6   HPI   15.0   65.0        1.0        1.0
5        3  CPI_lg12   CPI   15.0   90.0        1.0        2.0
6        3   CPI_lg1   CPI   20.0   95.0        2.0        1.0

工作原理:

对于 mask2,如果匹配 mask1 并过滤原始列 Cluster,则过滤所有 Cluster 值,然后通过 ~ 反转掩码。最后通过 | 将两个条件链接为按位 OR 对于所有没有 CPI 的行如果存在每个 Cluster 的另一个值:

print (df.assign(mask1 = m, mask2 = ~df['Cluster'].isin(df.loc[m, 'Cluster']), both = m1))
   Cluster  Variable Group  Ratio  Value  mask1  mask2   both
0        1    GDP_M3   GDP   20.0   70.0  False   True   True
1        1    HPI_M6   HPI   40.0   80.0  False   True   True
2        1   GDP_lg2   GDP   35.0   50.0  False   True   True
3        2    CPI_M9   CPI   10.0   50.0   True  False   True
4        2   HPI_lg6   HPI   15.0   65.0  False  False  False
5        3  CPI_lg12   CPI   15.0   90.0   True  False   True
6        3   CPI_lg1   CPI   20.0   95.0   True  False   True

编辑:

df[['Ratio','Value']]=df[['Ratio','Value']].apply(lambda x: x.str.strip('%')).astype(float)

m = df['Group'].isin(['CPI','HPI'])
m2 = df.groupby('Cluster')['Group'].transform('nunique').ne(1)
m1 = (~df['Cluster'].isin(df.loc[~m, 'Cluster']) | m) & m2
df['RankRatio'] = df[~m1].groupby('Cluster')['Ratio'].rank(method='first', ascending=True)
df['RankValue'] = df[~m1].groupby('Cluster')['Value'].rank(method='first', ascending=False)
print (df)
   Cluster  Variable Group  Ratio  Value  RankRatio  RankValue
0        1    GDP_M3   GDP   20.0   70.0        1.0        1.0
1        1    HPI_M6   HPI   40.0   80.0        NaN        NaN
2        1   GDP_lg2   GDP   35.0   50.0        2.0        2.0
3        2    CPI_M9   CPI   10.0   50.0        NaN        NaN
4        2   HPI_lg6   HPI   15.0   65.0        NaN        NaN
5        3  CPI_lg12   CPI   15.0   90.0        1.0        2.0
6        3   CPI_lg1   CPI   20.0   95.0        2.0        1.0

print (df.assign(mask1 = m, mask2 = ~df['Cluster'].isin(df.loc[~m, 'Cluster']), m2=m2, all = ~m1))
   Cluster  Variable Group  Ratio  Value  RankRatio  RankValue  mask1  mask2  \
0        1    GDP_M3   GDP   20.0   70.0        1.0        1.0  False  False   
1        1    HPI_M6   HPI   40.0   80.0        NaN        NaN   True  False   
2        1   GDP_lg2   GDP   35.0   50.0        2.0        2.0  False  False   
3        2    CPI_M9   CPI   10.0   50.0        NaN        NaN   True   True   
4        2   HPI_lg6   HPI   15.0   65.0        NaN        NaN   True   True   
5        3  CPI_lg12   CPI   15.0   90.0        1.0        2.0   True   True   
6        3   CPI_lg1   CPI   20.0   95.0        2.0        1.0   True   True   

      m2    all  
0   True   True  
1   True  False  
2   True   True  
3   True  False  
4   True  False  
5  False   True  
6  False   True