我如何根据 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%
我想根据单独列中的 Ratio
和 Value
对 Variable
进行排名。 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_M3
在 20%
处具有最低的 Ratio
,而 HPI_M3
在 80%
处具有最高的 Value
].因此,他们都将被分配到第 1 位,其他人将随后被分配。
对于集群 2,即使 CPI_M9
的比率最低,但 CPI
不是首选。因此,排名 1 将分配给 HPI_lg6
.
对于集群 3,只有 CPI
组中有变量,没有其他选项可以排名。因此,CPI_lg12
和CPI_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
假设,我有 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% |
我想根据单独列中的 Ratio
和 Value
对 Variable
进行排名。 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_M3
在 20%
处具有最低的 Ratio
,而 HPI_M3
在 80%
处具有最高的 Value
].因此,他们都将被分配到第 1 位,其他人将随后被分配。
对于集群 2,即使 CPI_M9
的比率最低,但 CPI
不是首选。因此,排名 1 将分配给 HPI_lg6
.
对于集群 3,只有 CPI
组中有变量,没有其他选项可以排名。因此,CPI_lg12
和CPI_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