【问题标题】:Iterate through df rows and sum values of two columns separately until condition is met on one of those columns分别遍历 df 行和两列的总和值,直到其中一列满足条件
【发布时间】:2021-01-29 12:47:04
【问题描述】:

我肯定还在学习 python 并且尝试了无数方法,但无法弄清楚这一点。

我有一个包含 2 列的数据框,分别称为 A 和 B。我需要返回一个 df,它将独立地对这两列中每一列的行值求和,直到 A 的阈值总和超过某个值,对于这个例子,让我们说 10。到目前为止,我正在尝试使用 iterrows() 并且可以根据 if 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

提前感谢您,花费了很多时间,非常感谢您的帮助!!! 干杯

【问题讨论】:

    标签: python pandas iteration conditional-statements


    【解决方案1】:

    这是一个更短的工作:

    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 返回元素的数量,因此它将行乘以列。这就是为什么我将大小除以列数得到实际行数的原因。

    【讨论】:

    • 非常感谢您提供除了答案之外的指导...两种回答都有效,并且在经历了几次轻微的“翻译中丢失”打嗝之后(我过于简单化了,我能够继续我的工作。再次非常感谢你!
    • 不客气。请选择最适合您所问问题的答案之一,将其选作您的问题的答案...如果两者都有效,则 David 的答案是第一位的,应该被标记为您的答案。
    【解决方案2】:

    我很少为 pandas 编写长循环,但我没有看到使用 pandas 方法的方法。试试这个可怕的循环:(:

    1. 我创建的变量t 本质上是检查累积和以查看是否> n(我们已将其设置为10)。然后,我们决定使用 t,累积一些或 i 任何给定行的数据框中的值(ju 与 B 列的同一事物并行存在)。
    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
    

    【讨论】:

    • @wpy 请让我知道这是否适用于您的数据框。如果不是,请举个例子说明它在哪里损坏。
    • 谢谢大卫!我会在今天早上调整您的解决方案并返回...再次感谢您!
    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-01
    • 2016-11-16
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多