【问题标题】:repeat values of a column based on a condition根据条件重复列的值
【发布时间】:2023-03-09 08:35:01
【问题描述】:

我有一个数据框,其中包括名为“海拔”、“距离”、“坡度”的三列。 “坡度”列是使用前两列“高度”、“距离”计算的。 @第一步的目的是使用下面解释的条件计算“斜率”: 部署了一个条件函数,从“距离”变量的顶部列开始,并将值相加(总和),直到它们的总和大于或等于 10 (>=10)。如果这种情况得到纠正,则使用给定的公式计算“坡度”:坡度=平均(海拔)/(总和(距离))。 “距离”的总和是从该值的第一个值计数到“距离”已停在那里的索引)。 以下代码用于上述说明(作者 Tim Roberts):

   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
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)

输出:斜率:[0.8988484798276862, 0.8448607949571003, 0.6933681376947548]


我的问题:然后下一部分: 我将从代码中重复收到的号码:[0.8988484798276862, 0.8448607949571003, 0.6933681376947548]。我希望通过与之关联的行数来重复每个数字。例如,0.8988484798276862 将在新列中重复四次,然后 0.8448607949571003 将重复两次,依此类推

我在下面写了一个代码,但它返回空值:

RR=[]
for i in list(range(df.shape[0])):
    sumdist += df.loc[i,'Distance']
    sumalt += df.loc[i,'Altitude']
    cntx += 1
    if sumdist >= 10:
       R_s=np.repeat(df['Slope'].to_numpy()) 
       RR.append(R_s)

RR=DataFrame(RR)

【问题讨论】:

  • 你能用更精确的方式写下你的问题吗?我真的不明白需要做什么。
  • 您能否澄清一下您所说的“与斜坡相关的值”是什么意思。数字 4 和 2 来自哪里?还请包括您对所提供数据的预期输出。这有助于进一步阐明数据应采用的格式。请参阅 MRE - Minimal, Reproducible, ExampleHow to make good reproducible pandas examples
  • 谢谢亨利。我想重复接收到的“坡度”值,该值位于新列中的三行,从第一行到最后。声誉的数量取决于条件“距离”值的总和应大于或等于 10(sum(distance>=10)。例如,对于“坡度”的第一项,即 0.898848,将在新列中重复四次,因为总和'Distance'的前四个值大于10。然后为'Distance'的下两个值(从索引4到5)计算Slope的第二个值,请见图

标签: python pandas dataframe numpy


【解决方案1】:

在计算s 后使用此代码以获取具有所需值的斜率列:

sum_distance = 0
count = 0
idx = 0
slopes = []

for i in df['Distance'].values:
    idx += 1
    sum_distance += i
    if sum_distance>=10:
        slopes += [s[count]]*idx
        count += 1
        sum_distance = 0
        idx = 0

if idx > 0:
    slopes += [s[count]]*idx

df['Slope'] = slopes

输出:

>>> df
   Altitude  Distance     Slope
0      11.2     0.000  0.898848
1      11.2     3.018  0.898848
2      10.9     4.180  0.898848
3      10.1     4.873  0.898848
4       9.9     5.499  0.844861
5       9.4     5.923  0.844861
6       9.2     6.415  0.693368
7       8.5     1.063  0.693368
8       8.4     1.667  0.693368
9       7.9     3.114  0.693368

遍历了Distance列,对这些值求和并保留count个遍历过的值。每当 sum 为 10 或更多时,从 s 中选择值,并按照 count 显示的次数插入它们。重置 sumcount 并继续。

【讨论】:

  • 感谢 Ank,您的回答。它适用于样本数据。但是我正在处理的真实数据有一​​个 4434 的“距离”索引。当我运行大数据版本的代码时,我收到以下错误消息:“值长度 (4430) 与索引长度 (4434) 不匹配”
  • 是的,因为在您的真实数据中,距离的最后几个值的总和可能不 >= 10。我已经编辑了代码来解决这个问题。再试一次。
  • 谢谢。我的问题的第一部分是关于“斜率”计算的。我对“斜率”的计算做了一些更改。请你看一看再回来找我好吗?在这个评论框中,我有一些限制要写。请看问题的开头
  • 我明白了,现在有额外的步骤来计算斜率。但是,您应该考虑将其作为一个新问题发布,并在该帖子中链接此问题/答案。
  • 原因是如果我为坡度编写额外的步骤,我可能会破坏代码。这会让稍后碰巧访问此帖子的其他用户感到困惑。
猜你喜欢
  • 1970-01-01
  • 2021-05-09
  • 2019-11-27
  • 1970-01-01
  • 2022-01-14
  • 2023-03-27
  • 2020-01-15
  • 1970-01-01
  • 2014-10-25
相关资源
最近更新 更多