在Python中用累加数进行元素除法?

2024-10-04 03:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

标题可能会让人感到困惑(老实说,不太清楚如何用一句话来概括),所以这里有一个更好的解释:

我目前正在处理一个关于不同属性的dataFramea,我在数据列age上使用了一个.groupby[].count()函数来创建出现的列表:

A_sub = A.groupby(['age'])['age'].count()

A_sub返回类似以下的序列(值是随机修改的):

age
1    316
2    249
3    221
4    219
5    262
...
59    1
61    2
65    1
70    1
80    1
Name: age, dtype: int64

我想绘制一个元素划分的值列表。我要执行的除法是元素值除以索引大于或等于该元素的所有元素之和。换言之,例如,对于3岁的孩子,它应该会回来

221/(221+219+262+...+1+2+1+1+1)

相同的计算应适用于所有元素。理想情况下,结果应该是类似的类型/格式,以便可以绘制。你知道吗


Tags: 数据函数name元素标题列表age属性
3条回答

您可以使用pandas中的函数cumsum()来获得累计和:

A_sub = A['age'].value_counts().sort_index(ascending=False)
(A_sub / A_sub.cumsum()).iloc[::-1]

下面是一个使用numpy的快速示例。类似的方法也可以用在熊猫身上。for循环很可能被更聪明、更有效的方法来代替,以计算系数。你知道吗

import numpy as np

ages = np.asarray([316, 249, 221, 219, 262])
coefficients = np.zeros(ages.shape)

for k, a in enumerate(ages):
    coefficients[k] = sum(ages[k:])

output = ages / coefficients

输出:

array([0.24940805, 0.26182965, 0.31481481, 0.45530146, 1.        ])

编辑:0处初始化的系数和for循环可以替换为:

coefficients = np.flip(np.cumsum(np.flip(ages)))

没有理由使用numpy,熊猫已经包括了我们需要的一切。你知道吗

A_sub似乎返回一个序列,其中age是索引。这不太理想,但应该没问题。因此,下面的代码对一个系列进行操作,但是可以很容易地修改为工作数据帧。你知道吗

import pandas as pd

s = pd.Series(data=np.random.randint(low=1, high=10, size=10), index=[0, 1, 3, 4, 5, 8, 9, 10, 11, 13], name="age")
print(s)

res = s / s[::-1].cumsum()[::-1]
res = res.rename("cumsum div")

我在索引中看到你关于年龄缺失的评论。下面是如何添加从最小索引到最大索引范围内缺少的索引,然后执行除法。你知道吗

import pandas as pd

s = pd.Series(data=np.random.randint(low=1, high=10, size=10), index=[0, 1, 3, 4, 5, 8, 9, 10, 11, 13], name="age")

s_all_idx = s.reindex(index=range(s.index.min(), s.index.max() + 1), fill_value=0)
print(s_all_idx)

res = s_all_idx / s_all_idx[::-1].cumsum()[::-1]
res = res.rename("all idx cumsum div")

相关问题 更多 >