我有一个由日期列和分数列组成的数据帧。因此,每天都有很多价值观。所以我需要得到每天前10%数值的平均值。简单地说,我需要输出作为一天的列和当天前10%值的平均值。
这是一个示例数据集屏幕截图
`{'Date':
[
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1),
datetime.date(2021, 4, 1)],
'value': [
3.35,
1.85,
1.3,
1.85,
1.85,
1.17,
1.17,
2.8,
1.43,
2.54,
1.22,
2.54,
1.17,
1.17,
2.71,
5.98,
1.39,
1.48,
16.46,
1.43,
8.39,
33.99,
2.54,
11.8,
2.13,
2.24,
2.92,
1.35,
1.54,
2.52]}`
应该很简单-
*假设您使用的是Pandas,这是一个名为df
的Pandas数据帧,列为date
和value
创建一个演示数据帧并导入所需的包,您可能会将表作为数据帧导入
import pandas as pd
import math
import statistics
df = pd.DataFrame({'date': ['2021-04-01','2021-04-01','2021-04-01','2021-04-01','2021-04-01','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02'],
'value': [12,32,12,23,12,14,15,54,43,64,21,15]})
#If you need to save results as a DataFrame later on
res = pd.DataFrame(columns = ['date','top_10p_mean'])
- 根据日期筛选
基本上获取不同日期的列表,并对其进行迭代以获得列表中的值
for date in df['date'].unique():
temp = list(df['value'][df['date'] == date])
- 按值对过滤集进行排序
按相反顺序对列表进行排序,使最高值位于顶部,或者您可以省略reverse=True
部分,使值保持原样
temp.sort(reverse=True)
- 取前10%值的平均值
这将计算列表前10%中的项目数(索引四舍五入到下一个整数(,取这些值并计算平均值
初学者功能的进一步解释-
第一个";round_up_to_next_integer(total_number_of_items(in_list(*10%(">
然后"give_me_mean_of(list_items[from_index_0:the_number_I_got_from_the_percentage_calculation](">
avg = statistics.mean(temp[0:math.ceil(len(temp)*0.1)])
- 打印或保存在新的DataFrame中
打印结果并将其附加到先前创建的空DataFrame
print('Mean value on ' + str(date) + ' = ' + str(avg))
res = res.append({'date': date, 'top_10p_mean': avg}, ignore_index=True)
所以总的来说,它应该像这样工作——
import pandas as pd
import math
import statistics
df = pd.DataFrame({'date': ['2021-04-01','2021-04-01','2021-04-01','2021-04-01','2021-04-01','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02','2021-04-02'],
'value': [12,32,12,23,12,14,15,54,43,64,21,15]})
df
Out[]:
date value
0 2021-04-01 12
1 2021-04-01 32
2 2021-04-01 12
3 2021-04-01 23
4 2021-04-01 12
5 2021-04-02 14
6 2021-04-02 15
7 2021-04-02 54
8 2021-04-02 43
9 2021-04-02 64
10 2021-04-02 21
11 2021-04-02 15
res = pd.DataFrame(columns = ['date','top_10p_mean'])
for date in df['date'].unique():
temp = list(df['value'][df['date'] == date])
temp.sort(reverse=True)
print(temp) #Just to show what it looks like
avg = statistics.mean(temp[0:math.ceil(len(temp)*0.1)])
print('nMean value on ' + str(date) + ' = ' + str(avg) + 'n')
res = res.append({'date': date, 'top_10p_mean': avg}, ignore_index=True)
Out[]:
[32, 23, 12, 12, 12]
Mean value on 2021-04-01 = 32
[64, 54, 43, 21, 15, 15, 14]
Mean value on 2021-04-02 = 64
res
Out[]:
date top_10p_mean
0 2021-04-01 32
1 2021-04-02 64
df.nmaximum就是您想要的。首先通过运行(df
是您的数据帧(来确定有多少值对应于10%:
highest10p = 0.1*len(df)
然后可以使用在value
列中选择10个最大值
df.nlargest(highest10p, 'value')
因此,如果你想要平均值,你可以使用.mean()
函数:
df.nlargest(highest10p, 'value').mean()