为了账号安全,请及时绑定邮箱和手机立即绑定

迭代 df 行并分别对两列求和,直到其中一列满足条件

迭代 df 行并分别对两列求和,直到其中一列满足条件

慕尼黑5688855 2023-11-09 21:40:51
我肯定仍在学习 python,并尝试了无数的方法,但无法弄清楚这一点。我有一个包含 2 列的数据框,将它们称为 A 和 B。我需要返回一个 df,它将独立地对这两列中每一列的行值求和,直到 A 的阈值总和超过某个值,在本例中假设为 10。到目前为止,我正在尝试使用 iterrows() 并可以根据 A >= 10 获取分段,但在满足阈值之前似乎无法解决行求和。即使最终 A 值不满足条件阈值,所得 df 也必须是详尽的 - 请参阅所需输出的最后一行。    df1 = pd.DataFrame(data = [[20,16],[10,5],[3,2],[1,1],[12,10],[9,7],[6,6],[5,2]],columns=['A','B'])    df1        A   B    0   20  16    1   10  5    2   3   2    3   1   1    4   12  10    5   9   7    6   6   6    7   5   2期望的结果:        A   B    0   20  16    1   10  5    2   16  13    3   15  13    4   5   2预先感谢您,花费了很多时间,非常感谢您的帮助!干杯
查看完整描述

2 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

我很少为 pandas 编写长循环,但我没有找到使用 pandas 方法来执行此操作的方法。试试这个可怕的循环:(:

  1. 我创建的变量t本质上是检查累积和是否> n(我们将其设置为10)。然后,我们决定使用,即数据框中任何给定行的t累积值或值(并且与 B 列的相同值并行)。iju

  2. 有一些条件,所以有一些elif语句,并且按照我设置的方式,最后一行会有不同的行为,所以我必须对最后一行有一些单独的逻辑 - 否则if最后一个值不会得到附:

import pandas as pd

df1 = pd.DataFrame(data = [[20,16],[10,5],[3,2],[1,1],[12,10],[9,7],[6,6],[5,2]],columns=['A','B'])

df1


a,b = [],[]

t,u,count = 0,0,0

n=10

for (i,j) in zip(df1['A'], df1['B']):

    count+=1

    if i < n and t >= n:

        a.append(t)

        b.append(u)

        t = i

        u = j

    elif 0 < t < n:

        t += i

        u += j

    elif i < n and t == 0:

        t += i

        u += j

    else:

        t = 0

        u = 0

        a.append(i)

        b.append(j)

    if count == len(df1['A']):

        if t == i or t == 0:

            a.append(i)

            b.append(j)

        elif t > 0 and t != i:

            t += i

            u += j

            a.append(t)

            b.append(u)

df2 = pd.DataFrame({'A' : a, 'B' : b})

df2


查看完整回答
反对 回复 2023-11-09
?
RISEBY

TA贡献1856条经验 获得超5个赞

这是一个更短的有效方法:


import pandas as pd


df1 = pd.DataFrame(data = [[20,16],[10,5],[3,2],[1,1],[12,10],[9,7],[6,6],[5,2]],columns=['A','B'])

df2 = pd.DataFrame()

index = 0

while index < df1.size/2:

    if df1.iloc[index]['A'] >= 10:

        a = df1.iloc[index]['A']

        b = df1.iloc[index]['B']

        temp_df = pd.DataFrame(data=[[a,b]], columns=['A','B'])

        df2 = df2.append(temp_df, ignore_index=True)

        index += 1

    else:

        a_sum = 0

        b_sum = 0

        while a_sum < 10 and index < df1.size/2:

            a_sum += df1.iloc[index]['A']

            b_sum += df1.iloc[index]['B']

            index += 1

        if a_sum >= 10:

            temp_df = pd.DataFrame(data=[[a_sum,b_sum]], columns=['A','B'])

            df2 = df2.append(temp_df, ignore_index=True)

        else:

            a = df1.iloc[index-1]['A']

            b = df1.iloc[index-1]['B']

            temp_df = pd.DataFrame(data=[[a,b]], columns=['A','B'])

            df2 = df2.append(temp_df, ignore_index=True)

关键是跟踪您在 DataFrame 中的位置并跟踪总和。不要害怕使用变量。


在 Pandas 中,使用 iloc 按索引访问每一行。通过检查大小来确保不会超出 DataFrame 范围。df.size 返回元素的数量,因此它将行乘以列。这就是为什么我将大小除以列数以获得实际行数。


查看完整回答
反对 回复 2023-11-09
  • 2 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信