从另一个列求和

时间:2019-11-04 21:40:34

标签: python pandas dataframe

这是我的问题:

在我的数据框中,我有两个列:km和value

    km    value
0   1      10
1   10     2
2   3      5

,我想从km的范围内得出价值的总和 就像1

我已经尝试过了:

 i = 0
 j = 3
 while j < 200 :
     sum_km = dvf[i < dvf['km'] and j >= dvf['km'] ]['value'].sum()
     i += 3
     j += 3

但是我有:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我想在结尾处:

Total value for 1 at 3 kms : 15
Total value for 3 at 6 kms : 0
Total value for 6 at 9 kms : 0
Total value for 9 at 12 kms : 2

5 个答案:

答案 0 :(得分:2)

如果需要所有间隔:

width = 3
min_val = dvf['km'].min() - 1
max_val = dvf['km'].max()
bins = pd.IntervalIndex.from_tuples([(x, x+width) for x in range(min_val, max_val, width)])
dvf.groupby(pd.cut(dvf['km'], bins = bins))['value'].agg('sum')



>>> output

km
(0, 3]     15
(3, 6]      0
(6, 9]      0
(9, 12]     2

我将品脱格式留给您,因为这似乎不是主要问题。

答案 1 :(得分:1)

我的解决方案与ansev相似,只是我对您的分组有所不同。

df['bin'] = (df['km']/3).astype(int)
df[['bin','value']].groupby('bin').agg(sum)

答案 2 :(得分:1)

我的解决方案pd.cut

df.value.groupby(pd.cut(df.km,[0,3,6,9,12])).sum()
Out[400]: 
km
(0, 3]     15
(3, 6]      0
(6, 9]      0
(9, 12]     2
Name: value, dtype: int64

答案 3 :(得分:-1)

使用pd.interval_range + pd.cut

bins=pd.interval_range(df['km'].min()-1, 12, freq=3)
df.groupby(pd.cut(df['km'],bins)).value.sum()

km
(0, 3]     15
(3, 6]      0
(6, 9]      0
(9, 12]     2
Name: value, dtype: int64

答案 4 :(得分:-2)

您需要布尔运算符:

dvf[(i < dvf['km']) & (j >= dvf['km'])]['value'].sum()