跨行对 Pandas 数据框进行分组

2024-03-02

我有一个这样的csv:

client1,client2,client3,client4,client5,client6,amount
,,,Comp1,,,4.475000
,,,Comp2,,,16.305584
,,,Comp3,,,4.050000
Comp2,Comp1,,Comp4,,,21.000000
,,,Comp4,,,30.000000
,Comp1,,Comp2,,,5.137500
,,,Comp3,,,52.650000
,,,Comp1,,,2.650000
Comp3,,,Comp3,,,29.000000
Comp5,,,Comp2,,,20.809000
Comp5,,,Comp2,,,15.100000
Comp5,,,Comp2,,,52.404000

将其读入 pandas 数据框 df 后,我想分两步进行聚合:

Step1:

首先,我总结一下金额:

client1 client2 client3 client4 client5 client6  amount
                        Comp1                    7.125000
                        Comp2                    16.305584
                        Comp3                    56.700000
                        Comp4                    30.000000
         Comp1          Comp2                    5.137500
Comp2    Comp1          Comp4                    21.000000
Comp3                   Comp3                    29.000000
Comp5                   Comp2                    88.313000  

然后,我想按每个客户端名称进行聚合,这样如果像第 5 组那样涉及多个客户端,则 5.1375 必须在 Comp1 和 Comp2 之间平均分配。尝试了这样的方法:

df.groupby(['client1','client2','client3','client4','client5','client6']).apply(lambda x: x['amount'].sum()/len(x) if x.any().nunique()>=1 else x['amount'].sum())



client1 client2 client3 client4 client5 client6 0
0                           Comp1                   3.562500
1                           Comp2                   16.305584
2                           Comp3                   28.350000
3                           Comp4                   30.000000
4           Comp1           Comp2                   5.137500
5   Comp2   Comp1           Comp4                   21.000000
6   Comp3                   Comp3                   29.000000
7   Comp5                   Comp2                   29.437667

预期输出为:

Client Amount 
Comp1  4.475+21/3+5.1375/2+2.65 = 16.69375
Comp2  16.305584+21/3+20.809/2+15.10/2+52.404/2 = 67.462084
Comp3  4.05+52.65+29 = 85.7
Comp4  21/3+30 = 37
Comp5  20.809/2+15.10/2+52.404/2 = 44.1565

我尝试使用sum(axis=0)但没有用。


我们可以在这里使用一些数学知识

cols = ['amount'] 
# Divide the amount by non null fields 
df['new'] = df['amount']/df.drop(cols,1).notnull().sum(1)

#Set the index as new by droping amount column, unstack and drop the nans.
x = df.drop(cols,1).set_index('new').unstack().dropna()

#Create dataframe just from amount and the clients
ndf = pd.DataFrame({'amount':x.index.droplevel(0).values,'clients':x.values})

#Groupby client and get the sum 
ndf.groupby('clients').sum()

Output:



          amount
clients           
Comp1    16.360417
Comp2    69.697501
Comp3    85.700000
Comp4    36.666667
Comp5    44.156500
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

跨行对 Pandas 数据框进行分组 的相关文章

随机推荐

  • 如何在 JavaScript 中查找到已知位置的距离

    在浏览器中使用 JavaScript 如何确定从我当前位置到另一个我有纬度和经度的位置的距离 如果您的代码在浏览器中运行 您可以使用 HTML5 地理定位 API window navigator geolocation getCurren
  • Angular JS:如何绑定到 Promise

    我正在尝试将承诺与视图绑定 我不知道你是否可以直接这样做 但这就是我正在尝试做的 有什么想法我做错了吗 注意 源代码在超时方面做了一些设计 并使用了静态数据 但这是为了使代码更易于诊断 EDIT JSFiddle 页面 http jsfid
  • 与 REST-assured 相比,使用 SOAP UI 来自动化 CI 的 REST 服务是否有优势

    我必须在我的项目中自动化 REST API 测试并将其集成到 jenkins 中的现有 CI 中 我即将开始使用 REST assured 进行编码 但是我碰巧看到 SOAP UI REST 教程并了解到 SOAP UI 中有一个 Mave
  • 如何在 C# 中读取二进制文件?

    我有一个存在于文本和二进制图像中的文件 我需要从 0 到 30 位置读取相关文本 而 31 上的位置将是二进制格式的图像 我必须遵循哪些步骤才能解决该问题 目前 我正在尝试使用它来阅读它FileStream 然后我将 FileStream
  • .NET 使用错误的 2.0 machine.config 而不是 4.0

    我在 IIS 7 0 Windows Server 2008 R1 上安装了 NET Web 应用程序 我已在服务器上安装了 NET 4 0 并为 4 0 配置了应用程序池和集成管道 由于某种原因 我收到以下错误 500 19 The co
  • 通过三种方法计算 CCA

    我最近研究了 CCA 的概念 并想在 MATLAB 中实现它 但是有一个现有的 matlab 命令佳能 http in mathworks com help stats canoncorr html展示 我想编写自己的代码 我对其进行了广泛
  • SQL 如何根据现有列的计数为新列创建值?

    我有一个正在读取的临时表 我想查看只有两个等级值的列之一 3 或 4 并构建两个新列 一个保存 3 的计数和另一个用于保存 4 的计数 按特定分组 我的代码看起来像这样 Select Max Counting as Total studen
  • 使用 VPC 配置添加 AWS Lambda 导致访问 S3 时超时

    我尝试从 AWS Lambda 访问 S3 和 VPC 上的资源 但由于我将 AWS Lambda 配置为访问 VPC 因此访问 S3 时超时 这是代码 from future import print function import bo
  • 单元测试覆盖调用 super() 的方法

    我试图找出为重写方法编写单元测试的最佳方法 该方法调用 super 作为最后一步 基本上 我想在基类中使用参数之前对其进行处理 下面是一个方法的示例 Override public JobExecution run Job job JobP
  • 如果没有尾部斜杠,Nginx 会导致 301 重定向

    我在使用 NAT 的虚拟机中运行 nginx 当我从主机访问它时遇到重定向问题 按预期工作 http localhost 8080 test index htm works http localhost 8080 test works 没有
  • Java 中有标准的 Option 或 Nullable 类吗?

    Nullable C 的含义有点不同 但无论如何Option 斯卡拉 和Nullable可以用来表达 有价值或无价值 的概念 例如 当您想在字符串中查找子字符串时 最好返回 Option Int 在 Scala 中 而不是晦涩难懂的 1 作
  • 如何使用dispatchEvent提交无按钮表单

    如果我有一个无按钮的表单 并且我想测试可能的 onsubmit 函数是否返回 true 然后提交它 这是我当前的代码 运行良好 var form document getElementById form var evt document c
  • 替换 PHP 数组键中的子字符串

    假设您有一个像这样的 PHP 数组 来自 mysqli 查询 array user id gt 1 user name gt User user email gt email protected cdn cgi l email protec
  • 将类名添加到 uibinder xml 文件中的元素

    以下内容替换任何当前的 css 类名称 看来是叫setStyleName
  • 如何使用 xquery update 将节点内的文本转换为子节点?

    我有一个 xml 文档 例如
  • 检查模拟对象的类类型

    我正在测试一个方法 该方法获取一个对象并检查该对象是否是存储为实例变量的类的实例 到目前为止没有问题 但在测试中我必须使用模拟 并且这些模拟之一是传递给该方法的对象 而现在 事情变得棘手了 我们看一下代码 我总结了本次测试的代码 Class
  • 如何在VBA中的公式中插入变量

    有人能解决这个问题吗 Sub test Dim i as integer For I 1 to 10 ActiveCell Offset 0 2 Formula Sum E15 i Next I End Sub 你的实际目标不清楚 你可能想
  • 编辑字典列表中的值?

    my dicts key1 value1 key2 value2 key1 value1 key2 value2 key1 value1 key2 value2 将 value2 的所有实例替换为 value3 的最有效方法是什么 我没有做
  • TDE 启用对数据库性能有何影响?

    如果我在数据库上使用透明数据加密 会对数据库性能产生任何影响吗 这会导致数据库索引出现问题吗 有些人已经对此进行了测试 参见here http www databasejournal com features mssql article p
  • 跨行对 Pandas 数据框进行分组

    我有一个这样的csv client1 client2 client3 client4 client5 client6 amount Comp1 4 475000 Comp2 16 305584 Comp3 4 050000 Comp2 Co