2 回答

TA貢獻1993條經驗 獲得超6個贊
我很少為 pandas 編寫長循環,但我沒有找到使用 pandas 方法來執行此操作的方法。試試這個可怕的循環:(:
我創建的變量
t
本質上是檢查累積和是否>n
(我們將其設置為10)。然后,我們決定使用,即數據框中任何給定行的t
累積值或值(并且與 B 列的相同值并行)。i
j
u
有一些條件,所以有一些
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

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 返回元素的數量,因此它將行乘以列。這就是為什么我將大小除以列數以獲得實際行數。
添加回答
舉報