Python Pandas -根据在列中找到的前x%值为行赋值

iecba09b  于 2022-12-10  发布在  Python
关注(0)|答案(2)|浏览(156)

以这个模型 Dataframe 为例:

CustomerID   Number of Purchases

   ABC                5
   DEF               24
   GHI               85
   JKL                2
   MNO              100

假设此数据框首先按Number of Purchases(降序)排序。如何向其中添加名为Score的新列,并按如下方式为其分配值:

  • 在前60%的客户(即排序后的前3行)中,应将3行分配给分数
  • 在接下来的前20%客户(排序后的第4行)中,应将2个分配给分数
  • 在下一个和最后一个前20%的客户(排序后的第5行)中,应将1分配给分数

如何在大型 Dataframe 中执行此操作?

qeeaahzv

qeeaahzv1#

import pandas as pd
import numpy as np

df = pd.DataFrame({'CustomerID': ['ABC', 'DEF', 'GHI', 'JKL', 'MNO'],
                   'Number of Purchases': [5, 24, 85, 2, 100]})

df = df.sort_values(by=['Number of Purchases'], ascending=False)

proc = len(df) / 100
aaa = [[0, int(60 * proc), 3], [int(60 * proc), int(80 * proc), 2], [int(80 * proc), len(df), 1]]
df['Score'] = np.nan
df = df.reset_index()

for i in aaa:
    df.loc[i[0]:i[1] - 1, 'Score'] = i[2]

print(df)

输出量

index CustomerID  Number of Purchases  Score
0      4        MNO                  100    3.0
1      2        GHI                   85    3.0
2      1        DEF                   24    3.0
3      0        ABC                    5    2.0
4      3        JKL                    2    1.0

首先是排序,其中指出:ascending=False,因此排序顺序为逆序。proc变量是1%中的行数。
创建一个嵌套列表aaa。其中第一个元素是字符串范围的起始索引,第二个元素是结束索引。第三个元素是评估。创建一个具有空值的“分数”列,并重置 Dataframe 索引。
在循环中,loc通过slice访问行(这是从哪个索引中选择行)。由于loc是非独占访问的(例如,结束索引为3,则将通过索引3选择数据),因此使用i[1] - 1。

cwxwcias

cwxwcias2#

一旦 Dataframe (df)已经被Number_of_Purchases排序
您可以使用以下命令生成Score列:

  • .rank(pct=True)-函数:计算排名(百分比)
  • 然后应用函数将该排名转换为分数。

代码:

import pandas as pd

# Create dataframe
df = pd.DataFrame({ 'CustomerID': ['ABC', 'DEF', 'GHI', 'JKL', 'MNO'],
                    'Number of Purchases': [5, 24, 85, 2, 100]})

# Sort and then create 'Score' column
df = df.sort_values(by=['Number of Purchases'], ascending=False).reset_index(drop=True)

df['Score'] = df['Number of Purchases'].rank(pct=True).apply(lambda x: 1 if x<=0.2 else 2 if x<=0.4 else 3)

print(df)

输出:

CustomerID  Number of Purchases  Score
0        MNO                  100      3
1        GHI                   85      3
2        DEF                   24      3
3        ABC                    5      2
4        JKL                    2      1

相关问题