Python中的按元素累加数除法?

Python中的按元素累加数除法?,python,pandas,numpy,numpy-ndarray,Python,Pandas,Numpy,Numpy Ndarray,标题可能会让人感到困惑(老实说,不太清楚如何用一句话来概括),因此这里有一个更好的解释: 我目前正在处理一个关于不同属性的数据帧a,我在数据列年龄上使用了.groupby[].count()函数来创建事件列表: A_sub = A.groupby(['age'])['age'].count() A_sub返回与以下类似的序列(值随机修改): 我想从元素划分中绘制一个值列表。我要执行的除法是一个元素值除以索引大于或等于该元素的所有元素之和。换言之,例如,对于3岁的人,它应该返回 221/(221

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

我目前正在处理一个关于不同属性的数据帧a,我在数据列
年龄
上使用了
.groupby[].count()
函数来创建事件列表:

A_sub = A.groupby(['age'])['age'].count()
A_sub
返回与以下类似的序列(值随机修改):

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

221/(221+219+262+...+1+2+1+1+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的快速示例。类似的方法也可用于熊猫。
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)))

您可以在pandas中使用函数
cumsum()
,以获取累计总和:

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

您可以在pandas中使用函数
cumsum()
,以获取累计总和:

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

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

A_sub
似乎返回一个系列,其中
age
是索引。这并不理想,但应该可以。因此,下面的代码在一个系列上运行,但可以很容易地修改以使用数据帧

将熊猫作为pd导入
s=pd.Series(数据=np.random.randint(低=1,高=10,大小=10),索引=[0,1,3,4,5,8,9,10,11,13],name=“年龄”)
印刷品
res=s/s[::-1].cumsum()[::-1]
res=res.rename(“积数div”)
我在索引中看到了你关于年龄缺失的评论。下面是如何添加从最小索引到最大索引范围内缺少的索引,然后执行除法

将熊猫作为pd导入
s=pd.Series(数据=np.random.randint(低=1,高=10,大小=10),索引=[0,1,3,4,5,8,9,10,11,13],name=“年龄”)
s_all_idx=s.reindex(索引=范围(s.index.min(),s.index.max()+1),填充值=0)
打印(s_all_idx)
res=s_all_idx/s_all_idx[::-1].cumsum()[::-1]
res=res.rename(“所有idx累计div”)

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

A_sub
似乎返回一个系列,其中
age
是索引。这并不理想,但应该可以。因此,下面的代码在一个系列上运行,但可以很容易地修改以使用数据帧

将熊猫作为pd导入
s=pd.Series(数据=np.random.randint(低=1,高=10,大小=10),索引=[0,1,3,4,5,8,9,10,11,13],name=“年龄”)
印刷品
res=s/s[::-1].cumsum()[::-1]
res=res.rename(“积数div”)
我在索引中看到了你关于年龄缺失的评论。下面是如何添加从最小索引到最大索引范围内缺少的索引,然后执行除法

将熊猫作为pd导入
s=pd.Series(数据=np.random.randint(低=1,高=10,大小=10),索引=[0,1,3,4,5,8,9,10,11,13],name=“年龄”)
s_all_idx=s.reindex(索引=范围(s.index.min(),s.index.max()+1),填充值=0)
打印(s_all_idx)
res=s_all_idx/s_all_idx[::-1].cumsum()[::-1]
res=res.rename(“所有idx累计div”)

我不太习惯熊猫和系列,但在numpy中,这是相当接近的,你可以先计算系数的向量,然后用这些系数除以你的年龄计数器。嗨@Mathieu,你介意演示一下这个过程吗?我不太确定我是否遵循,因为我不太习惯在numpy中这样做。我不太习惯熊猫和系列,但在numpy中,这是相当接近的,你可以从计算系数向量开始,你想除以每个元素,然后用你的年龄计数器除以这些系数。你好,马修,你介意演示一下这个过程吗?我不太确定我是否能听懂,因为我不太习惯在努比这样做。谢谢马修!然后我可能会做的只是
np.asarray(A_sub)
。我的一个担忧是,此方法忽略了没有值的年龄(例如,将从数组中跳过年龄60)。是否可以将没有值的年龄设置为0?因此,60、62、63、64、66等年龄段,。。。都会有一个0的数值,因此会影响结果(在元素数量方面)。@Robin当然有可能,但是你想如何考虑0的年龄?把它们拿出来?目前,这正是你在帖子中描述的。你能举例说明一下你对
[316,249,221,219,0,262,0]
(0代表5和7)的预期输出吗?谢谢Mathieu!然后我可能会做的只是
np.asarray(A_sub)
。我的一个担忧是,此方法忽略了没有值的年龄(例如,将从数组中跳过年龄60)。是否可以将没有值的年龄设置为0?因此,60、62、63、64、66等年龄段,。。。都会有一个0的数值,因此会影响结果(在元素数量方面)。@Robin当然有可能,但是你想如何考虑0的年龄?把它们拿出来?目前,这正是你在帖子中描述的。您能举例说明一下
[316、249、221、219]的预期输出吗