选择熊猫行的前%

时间:2020-07-10 20:21:51

标签: python pandas

我有一个示例数据框,如下所示(实际数据集的长度约为30万个条目):


        user_id   revenue  
 ----- --------- --------- 
    0       234       100  
    1      2873       200  
    2       827       489  
    3        12       237  
    4      8942     28934  
  ...       ...       ...  
   96       498    892384  
   97      2345        92  
   98       239      2803  
   99      4985     98332  
  100       947      4588  

显示用户产生的收入。我想选择收入最高的20%的行(因此为收入最高的20%的用户提供行)。

最让我想到的方法是计算用户总数,计算出总数的20%,然后将数据帧与sort_values()进行排序,然后使用head()nlargest() ,但我想知道是否有一种更简单,更优雅的方法。

有人可以为此提出建议吗? 谢谢!

4 个答案:

答案 0 :(得分:1)

假设您有数据框df

user_id revenue
234     21  
2873    20  
827     23  
12      23  
8942    28  
498     22  
2345    20  
239     24  
4985    21  
947     25

我已经弄平了收入分配以显示这个想法。 现在逐步进行计算:

df = pd.read_clipboard()
df = df.sort_values(by = 'revenue', ascending = False)
df['revenue_cum'] = df['revenue'].cumsum()
df['%revenue_cum'] = df['revenue_cum']/df['revenue'].sum()
df

结果:

   user_id  revenue  revenue_cum  %revenue_cum
4     8942       28           28      0.123348
9      947       25           53      0.233480
7      239       24           77      0.339207
2      827       23          100      0.440529
3       12       23          123      0.541850
5      498       22          145      0.638767
0      234       21          166      0.731278
8     4985       21          187      0.823789
1     2873       20          207      0.911894
6     2345       20          227      1.000000

只有2个顶级用户产生了总收入的23.3%。

答案 1 :(得分:0)

df.quantile似乎是大熊猫documentation的情况,如果您要寻找前20%,那么您需要做的就是传递所需的正确分位数。

数据集中的案例:

import pandas as pd
import numpy as np
df = pd.DataFrame({'user_id':[234,2873,827,12,8942],
                           'revenue':[100,200,489,237,28934]})
df.quantile([0.8,1],interpolation='nearest')

这将打印出值的前2行:

     user_id  revenue
0.8     2873      489
1.0     8942    28934

答案 2 :(得分:0)

我通常发现使用sort_values来查看每一行的累积效果,然后将行保持在某个阈值以下很有用:

# Sort values from highest to lowest:
df = df.sort_values(by='revenue', ascending=False)

# Add a column with aggregated effect of the row:
df['cumulative_percentage'] = 100*df.revenue.cumsum()/df.revenue.sum()

# Define the threshold I need to analyze and keep those rows:
min_threshold = 30
top_percent = df.loc[df['cumulative_percentage'] <= min_threshold]

原始df可以很好地排序,并清楚地指示出最重要的行,并且创建的'top_percent'df将包含需要特别分析的行。

答案 3 :(得分:0)

我假设您正在寻找产生20%收入的累积用户。这是一个可以帮助您获得预期输出甚至更多的功能。只需指定您的数据框,收入的列名和您要查找的n_percent:

import pandas as pd

def n_percent_revenue_generating_users(df, col, n_percent):
    df.sort_values(by=[col], ascending=False, inplace=True)
    df[f'{col}_cs'] = df[col].cumsum()
    df[f'{col}_csp'] = 100*df[f'{col}_cs']/df[col].sum()
    df_ = df[df[f'{col}_csp'] > n_percent]
    index_nearest = (df_[f'{col}_csp']-n_percent).abs().idxmin()
    threshold_revenue = df_.loc[index_nearest, col]
    output = df[df[col] >= threshold_revenue].drop(columns=[f'{col}_cs', f'{col}_csp'])
    
    return output
    
n_percent_revenue_generating_users(df, 'revenue', 20)