对数据框中列的值进行计数和求和的条件函数

问题描述

我有一个包含“海拔”和“距离”变量的数据框。我将使用这两个提到的变量计算“斜率”变量。 我想放置一个条件函数,从“距离”变量的顶列开始,并将(总和)值相加,直到它们的总和大于或等于 10(>=10)。如果此条件正确,则使用给定公式计算“斜率”:Slope=Average(Altitude(from the first value to the index that the distance has stop there).请参见下图。这可能比我的方式更有意义我正在寻找坡度计算。我将不胜感激。我尝试了下面的命令系列,但很明显,它不起作用。

s=[]
for i in list(range(df.shape[0])):
    if sum(df.loc[i,'distance']) < 10:
       k=sum(df.loc[i,'distance'])
    elif sum(df.loc[i,'distance']) > 10:
        KM_mean=sum(df.loc[i,'distance'])/len(df.loc[i,'distance'])
        s.append(KM_mean)
Slope=Average('Altitude')/sum('distance')

Altitude  distance
11.2      0
11.2      3.018
10.9      4.18
10.1      4.873
9.9       5.499
9.4       5.923
9.2       6.415
8.5       1.063
8.4       1.667
7.9       3.114

enter image description here

解决方法

您必须自己跟踪累计金额。您对 sum 函数的使用只是对当前行求和。

import pandas as pd

data = [
[11.2,0],[11.2,3.018],[10.9,4.18],[10.1,4.873],[9.9,5.499],[9.4,5.923],[9.2,6.415],[8.5,1.063],[8.4,1.667],[7.9,3.114]
]

df = pd.DataFrame( data,columns=['Altitude','Distance'])
print( df )

s=[]
sumdist = 0
sumalt = 0
cntx = 0
for i in list(range(df.shape[0])):
    sumdist += df.loc[i,'Distance']
    sumalt += df.loc[i,'Altitude']
    cntx += 1
    if sumdist >= 10:
        KM_mean = sumalt / cntx / sumdist
        s.append(KM_mean)
        sumdist = sumalt = 0
        cntx = 0
if cntx:
    s.append( sumalt / cntx / sumdist )
print(s)

输出:

   Altitude  Distance
0      11.2     0.000
1      11.2     3.018
2      10.9     4.180
3      10.1     4.873
4       9.9     5.499
5       9.4     5.923
6       9.2     6.415
7       8.5     1.063
8       8.4     1.667
9       7.9     3.114
[0.8988484798276862,0.8448607949571003,0.6933681376947548]

我想您可以跟踪当前区域的开始并反复使用 df.sum,但这似乎是一种浪费。