gpt4 book ai didi

python - 根据 CSV 数据对 Python Pandas 组执行多项计算

转载 作者:太空宇宙 更新时间:2023-11-03 17:15:30 25 4
gpt4 key购买 nike

我每天都会自动创建 csv,用于平均大约 1000 行和 630 列的工作。我一直在尝试使用 pandas 创建一个摘要报告,我可以每天将其写入新的 txt.file 。

我面临的问题是我不知道如何按“提供者”对数据进行分组,同时还根据该组中的唯一值执行我自己的计算。

“开始”之后,其余列(-2000到300000)是基于时间(毫秒)的损益数据。该文件通常在 700-1000 行之间,我通常不使用列标题“20000”之后的任何数据(未显示)。

我正在尝试制作一个输出文本文件,该文件将按“provider”总结 csv 文件(每个文件通常有 5-15 个唯一的提供程序,并且每天都不同)。我想要执行的计算是:

Provider = df.group('providers')
total tickets = sum of 'filled' (filled column: 1=filled, 0=reject)
share % = a providers total tickets / sum of all filled tickets in file
fill rate = sum of filled / (sum of filled + sum of rejected)
Size = Sum of 'fill_size'
1s Loss = (count how many times column '1000' < $0) / total_tickets
1s Avg = average of column '1000'
10s Loss = (count how many times MIN of range ('1000':'10000') < $0) / total_tickets
10s Avg = average of range ('1000':'10000')

理想情况下,我的输出文件会将这些标题转置在顶部,并在下面转置 5-15 个唯一提供程序

虽然我仍然不明白编写所有这些自定义计算的正确格式,但我最大的障碍是在新数据帧(即total_tickets)中引用我的计算之一并将其应用于下一个计算(即1s)损失)

我正在寻找某人告诉我执行这些计算的最佳方法,并可能提供至少 2 或 3 个指标的示例。我认为如果我有正确的格式,我将能够运行该项目的其余部分。

感谢您的帮助。

最佳答案

您想要的功能是DataFrame.groupby ,文档 here 中有更多示例.

使用相当简单。

您的数据框中有一个名为 'provider' 的字段,因此要创建组,您只需调用 grouped = df.groupby('provider')。请注意,这不进行任何计算,只是告诉 pandas 如何查找组。

要将函数应用于此对象,您可以执行以下操作:

  1. 如果它是现有函数(例如 sum),请告诉分组对象您想要哪些列,然后调用 .sum(),例如 grouped['filled'].sum( ) 将给出每组的 'filled' 总和。如果您想要列的总和,grouped.sum() 就可以做到。对于第二个示例,您可以将此结果系列除以 df['filled'].sum() 以获得百分比。
  2. 如果您想传递自定义函数,可以调用 grouped.apply(func) 将该函数应用于每个组。

要存储您的值(例如,总门票数),您只需将它们分配给一个变量,即 total_tickets = df['filled'].sum()tickets_by_provider = grouped['filled'].sum().然后您可以在其他计算中使用它们。

更新:对于一秒的损失(以及其他损失),您需要两件事:

  1. 每个提供者的次数 df['1000'] < 0
  2. 每个提供商的记录总数

这些都适合 groupby。

首先,您可以将 grouped.applylambda function 一起使用。 。它可能看起来像这样:

_1s_loss_freq = grouped.apply(lambda x: x['fill'][x['1000'] < 0].sum())

对于组总计,您只需选择一列并获取计数。这是通过 count() 函数完成的。

records_per_group = grouped['1000'].count()

然后,由于 pandas 与索引对齐,因此您可以使用 _1s_loss_freq/records_per_group 获取百分比。

这类似于 10 秒损失问题。

关于一系列列的平均值的最后一个问题依赖于 pandas 对如何应用函数的理解。如果您获取数据帧并调用 dataframe.mean(),pandas 将返回每列的平均值。 mean() 中有一个默认参数,即 axis=0。如果将其更改为 axis=1,pandas 将取每行的平均值。

对于您的最后一个问题,10s Avg,我假设您已经聚合到提供程序级别,以便每个提供程序都有一行。我将使用下面的 sum() 来完成此操作,但任何聚合都可以。假设您想要平均值的列存储在名为 cols 的列表中,您需要:

one_rec_per_provider = grouped[cols].sum()
provider_means_over_cols = one_rec_per_provider.mean(axis=1)

关于python - 根据 CSV 数据对 Python Pandas 组执行多项计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33702036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com