有三个熊猫系列
x = pd.Series([220,340,500,600,700,900,540,60])
y = pd.Series([2,1,2,2,1])
z = pd.Series([])
y的每个元素将表示要添加和放入z的元素个数 例如:如果系列的开头有2,则我将在开头220和340处添加前两个元素,以得到560,然后将其放在z中作为第一个元素。接下来,我在y中有1,这意味着我将从x(第三个元素)中提取500,并将其作为第二个元素放在z中,依此类推
这是我尝试过的
j = 0
for i in y:
par = y[i]
z[i] = x[j:par + j].sum()
j = j+par
答案 0 :(得分:3)
Groupby y的索引重复:
x.groupby(y.index.repeat(y)).sum()
0 560
1 500
2 1300
3 1440
4 60
dtype: int64
如果长度不匹配,将导致ValueError
。在这种情况下,一种更安全的选择是对累计进行分组,重复并重置索引:
x.groupby(y.cumsum().repeat(y).reset_index(drop=True)).sum()
答案 1 :(得分:1)
这是我的看法:
df = x.to_frame(name='x').reset_index(drop=True)
df['cat'] = pd.cut(df.index+1, y.cumsum(), labels=False)
df['cat'] = df['cat'].fillna(-1).add(1)
z = df.groupby('cat').x.sum()
出局:
cat
0.0 560
1.0 500
2.0 1300
3.0 1440
4.0 60
Name: x, dtype: int64
答案 2 :(得分:0)
这是索引冲突问题,只需更新循环以使用范围即可
j = 0
for i in range(len(y)):
par = y[i]
print('first',i)
z[i] = x[j:par + j].sum()
print('second',j,'par',par)
j = j+par
>> z
0 560
1 500
2 1300
3 1440
4 60