这是我的问题:
在我的数据框中,我有两个列: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
答案 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()