亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

迭代 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條經驗 獲得超6個贊

我很少為 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 關注
  • 227 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號