python - 尝试根据类型计算每行的百分比排名(这是一个包含大约 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 等级。
我检查了一些帖子的实现,我正在考虑使用
df['Pct_Rank'] = pd.DataFrame(df.groupby("Type").index.get_level_values('Value1').rank(pct = True)
但我不确定它是否正确。
我考虑过为每种类型创建子数据框并根据Value1对它们进行排序,但是如何在其相应类型中搜索每行值的位置?之后我可以编写一个函数并应用于每一行,计算它的 pct 等级
increment_type_A = 1/lengthA
……
如果类型 == A:
pct_rank = increment_typeA * position_in_its_type
…………
顺便问一下,有没有设置pct的参数?喜欢精度?我至少想要 0.001 之类的东西。
更新
我刚刚重新格式化了我的样本。在我选择它们并选择“粗体”后,桌子被弄乱了。
刚刚编辑以澄清具有超过 1 个数值列。并且 Value1 不是具有数值的第一列。
解决方案
如果我正确理解了这个问题,这应该有效:
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']
推荐阅读
- c# - C#不要在包含相同文本的列表中添加重复项
- docker - Docker compose 镜像升级
- arrays - 将字符串传递给另一个函数后如何打印字符串数组
- swift - 检测 SwiftUI 工作表何时被刷掉
- android - 实施 admob 后我的项目崩溃
- python - 如何使用 pandas 导入多个 csv 文件并连接到一个 DataFrame
- angular - 如何从角度的构造函数中为变量赋值?
- arrays - 使用从流中提取的值创建一个数组
- flutter - 如何在 InAppWebView 完全加载之前显示启动画面
- flutter - Flutter Android Studio - 卡在打开文件对话框