pandas - 有效地动态更新数据帧行
问题描述
我有两个单独的问题,我想根据该行的其他列或相关的其他行(即与所述行列值具有某些列值的其他行)中的值来设置数据框列中的值。
启动 DF
acct no product type amount product sum product id
0 100 1 35 0.0 NaN
1 100 2 45 0.0 NaN
2 100 2 50 0.0 NaN
3 101 4 10 0.0 NaN
4 101 4 1 0.0 NaN
5 102 5 70 0.0 NaN
6 102 6 90 0.0 NaN
在一个问题(工作)中,我想分组(在本例中为两列),取第三列中列出的值的总和,然后将此总和值写入所有未设置的此处分组的行数
ex (account-product group by 和 sum as product sum ):
acct no product type amount product sum product id
0 100 1 35 35.0 NaN
1 100 2 45 95.0 NaN
2 100 2 50 95.0 NaN
3 101 4 10 11.0 NaN
4 101 4 1 11.0 NaN
5 102 5 70 70.0 NaN
6 102 6 90 90.0 NaN
在另一个问题中(对于“有趣”),我想创建一个基于另一个列值“帐号”并遵循约定 account_number_i 的“product_id”,其中 i 是该帐户的第 i 个产品
ex(遍历帐户组并作为帐户 iter写入产品 ID ):
acct no product type amount product sum product id
0 100 1 35 0.0 100-1
1 100 2 45 0.0 100-2
2 100 2 50 0.0 100-3
3 101 4 10 0.0 101-1
4 101 4 1 0.0 101-2
5 102 5 70 0.0 102-1
6 102 6 90 0.0 102-2
在尝试完成这两项工作时,我首先遍历排序的数据帧并使用 group by 和 sum 之类的函数,但它的速度与您想象的一样慢。我对 pandas 语法的使用不如 python 舒服,我要问的一个原因是更好地掌握执行看似非常常见/重要的任务的最佳方法,即根据相关行更新空行。我已经使用 pandas 来计算平均值,并且知道这很快,但我想要的是更深奥一点。
解决方案
不要遍历你的数据框——99% 的时候有更好的选择。
groupby
使用withtransform
和可以轻松解决您的问题cumcount
:
df["product sum"] = df.groupby(["acct no","product type"])["amount"].transform('sum')
df["product id"] = df["acct no"].astype(str)+"-"+(df.groupby("acct no").cumcount()+1).astype(str)
print (df)
acct no product type amount product sum product id
0 100 1 35 35 100-1
1 100 2 45 95 100-2
2 100 2 50 95 100-3
3 101 4 10 11 101-1
4 101 4 1 11 101-2
5 102 5 70 70 102-1
6 102 6 90 90 102-2
推荐阅读
- python - 我如何制作一个 cron.yaml 文件来为谷歌云应用引擎每小时运行一次 python 脚本
- flutter - Quickblox Flutter SDK 示例 WebRTC 未连接
- python - 就地修改和非就地修改之间的区别是一些实现细节还是Python程序员需要知道的东西?
- javascript - 如何创建多维 PRNG?
- java - 如何更改这个泛型类,以便 main 方法可以工作?
- java - 尝试使用 Platform.runlater() 从另一个类更新 JavaFX 时出现空指针异常
- javascript - 如何验证登录页面的 websql 数据库中是否存在用户名和密码?
- javascript - 如何在 Javascript 中按名称删除兑现 - pwa
- flutter - 如何比较 Dart 中“is”运算符中的类型变量
- angular - 使用动态创建具有多个段的 SVG 圆
和