首页 > 解决方案 > 有效地动态更新数据帧行

问题描述

我有两个单独的问题,我想根据该行的其他列或相关的其他行(即与所述行列值具有某些列值的其他行)中的值来设置数据框列中的值。

启动 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 来计算平均值,并且知道这很快,但我想要的是更深奥一点。

标签: pandasdataframepandas-groupby

解决方案


不要遍历你的数据框——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

推荐阅读