从CSV数据对Python组执行多个计算

从CSV数据对Python组执行多个计算,python,csv,pandas,Python,Csv,Pandas,我有每天自动创建的csv的工作,平均约1000行,正是630列。我一直在尝试与pandas合作,创建一份总结报告,每天可以将其写入一个新的txt.file 我面临的问题是,我不知道如何按“提供者”对数据进行分组,同时根据该组中的唯一值执行我自己的计算 在“开始”之后,其余列(-2000到300000)是基于时间(毫秒)的损益数据。文件通常在700-1000行之间,我通常不使用超过列标题“20000”(未显示)的任何数据 我正在尝试制作一个输出文本文件,该文件将按“提供者”汇总csv文件(每个文件

我有每天自动创建的csv的工作,平均约1000行,正是630列。我一直在尝试与pandas合作,创建一份总结报告,每天可以将其写入一个新的txt.file

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

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

我正在尝试制作一个输出文本文件,该文件将按“提供者”汇总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')
Provider=df.group('providers'))
总票证=已填写的票证总数(填写栏:1=已填写,0=拒绝)
share%=总票证/文件中所有已填写票证的总和
填充率=填充总数/(填充总数+拒绝总数)
尺寸=填充尺寸之和
1s损失=(计算“1000”列的次数<$0)/总票数
1s平均值=列“1000”的平均值
10秒损失=(计算最小范围('1000':'10000')<$0的次数)/总票数
10s平均值=范围的平均值('1000':'10000')
理想情况下,我的输出文件将在顶部和下面的5-15个唯一提供者之间转换这些标题

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

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

谢谢您的帮助。

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

用法相当简单

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

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

  • 如果它是一个现有函数(如sum),请告诉分组对象您需要哪些列,然后调用
    .sum()
    ,例如
    grouped['filled'].sum()
    将给出每个组的
    'filled'
    之和。如果需要每列的总和,
    grouped.sum()
    会这样做。对于第二个示例,您可以将结果序列除以
    df['filled'].sum()
    ,以获得百分比
  • 如果要传递自定义函数,可以调用
    grouped.apply(func)
    将该函数应用于每个组
  • 要存储您的值(例如,总票证),您只需将它们分配给一个变量,即
    total\u tickets=df['filled'].sum()
    ,以及
    tickets\u by\u provider=grouped['filled'].sum()
    。然后可以在其他计算中使用这些参数

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

  • 每个提供程序df['1000']<0的次数
  • 每个提供程序的记录总数
  • 这两者都适合groupby

    对于第一种情况,您可以使用
    grouped.apply
    和一个。它可能是这样的:

    _1s_loss_freq = grouped.apply(lambda x: x['fill'][x['1000'] < 0].sum())
    
    然后,因为
    pandas
    与索引对齐,所以您可以通过
    \u 1s\u loss\u freq/records\u每个组获得百分比

    这类似于10秒损耗问题

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

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

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

    谢谢你的快速回复。我能够完成一些,但是,我被困在1s毒性,10s毒性和10s平均值上。我还没有真正弄清楚.appy(func)。另外,我如何将所有这些数据分组到一个数据帧中,而不是让提供者每次单独打印它们。我补充了到目前为止我完成的内容。当然,汤姆,我更新了上面的答案(不确定你是否收到了通知)。谢谢詹姆斯,我创建了这个文件,一切看起来都很好。唯一的另一个问题是关于1秒和10秒的损失,我如何在这些损失中添加if语句。我需要确保函数正在查看“填充”列,只计算实际填充的亏损交易,而不是被拒绝的交易。(即填充=1,拒绝=0)。以上编辑
    x['1000']<0
    创建一个布尔索引,因此您可以使用该索引仅获取x['fill']的值,其中该值为真。上面编辑的行是
    \u 1s\u loss\u freq=grouped.apply(lambda x:x['fill'][x['1000']<0.sum())
    one_rec_per_provider = grouped[cols].sum()
    provider_means_over_cols = one_rec_per_provider.mean(axis=1)