首页 > 解决方案 > 尝试根据类型计算每行的百分比排名(这是一个包含大约 10 个 unqiue 字符串的列)

问题描述

我有一个超过一百万行的数据框,其示例结构如下:

ID 类型 Value1 Value2...(更多列)

1 A 20 4 ...

2 A 30 5 ...

3 乙 14 7...

4 乙 12 9...

......

我希望我能得到

ID 类型 Value1 Value2 Pct_Rank_based_on_Value1 ...(更多列)

1 A 20 4 0.107 ...

2 A 30 5 0.021 ...

3 B 14 7 0.201 ...

4 B 12 9 0.875 ...

......

rank 应该按值的降序排列。最大值应该接近 0.001

为了澄清起见,我的目的是创建一个新列,它是行的 Value1 (这是一列离散数字)在其类型(这是一列字符串,只有 10 个唯一值)中的百分比排名。

对于第 1 行,ID 为 1,Type 为 A,Value 为 20,我想在 Type 也是 A 的那些行中计算 Value1 的 pct 等级。

  1. 我检查了一些帖子的实现,我正在考虑使用

    df['Pct_Rank'] = pd.DataFrame(df.groupby("Type").index.get_level_values('Value1').rank(pct = True)

    但我不确定它是否正确。

  2. 我考虑过为每种类型创建子数据框并根据Value1对它们进行排序,但是如何在其相应类型中搜索每行值的位置?之后我可以编写一个函数并应用于每一行,计算它的 pct 等级

increment_type_A = 1/lengthA

……

如果类型 == A:

pct_rank = increment_typeA * position_in_its_type

…………

顺便问一下,有没有设置pct的参数?喜欢精度?我至少想要 0.001 之类的东西。

更新

我刚刚重新格式化了我的样本。在我选择它们并选择“粗体”后,桌子被弄乱了。

刚刚编辑以澄清具有超过 1 个数值列。并且 Value1 不是具有数值的第一列。

标签: pythonpandasrank

解决方案


如果我正确理解了这个问题,这应该有效:

from pandas import DataFrame
df = DataFrame([['A', 20, 1], ['A', 30, 2], ['B', 14, 1], ['B', 12, 6]], columns=['Type', 'Value1', 'Value2'])
df['pct_rank'] = df.groupby('Type').rank(axis=0, pct=True, ascending=False)['Value1']

推荐阅读