我有一个示例数据框,如下所示(实际数据集的长度约为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()
,但我想知道是否有一种更简单,更优雅的方法。
有人可以为此提出建议吗? 谢谢!
答案 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)