2 回答

TA貢獻(xiàn)1993條經(jīng)驗(yàn) 獲得超6個(gè)贊
我很少為 pandas 編寫(xiě)長(zhǎng)循環(huán),但我沒(méi)有找到使用 pandas 方法來(lái)執(zhí)行此操作的方法。試試這個(gè)可怕的循環(huán):(:
我創(chuàng)建的變量
t
本質(zhì)上是檢查累積和是否>n
(我們將其設(shè)置為10)。然后,我們決定使用,即數(shù)據(jù)框中任何給定行的t
累積值或值(并且與 B 列的相同值并行)。i
j
u
有一些條件,所以有一些
elif
語(yǔ)句,并且按照我設(shè)置的方式,最后一行會(huì)有不同的行為,所以我必須對(duì)最后一行有一些單獨(dú)的邏輯 - 否則if
最后一個(gè)值不會(huì)得到附:
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貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊
這是一個(gè)更短的有效方法:
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)
關(guān)鍵是跟蹤您在 DataFrame 中的位置并跟蹤總和。不要害怕使用變量。
在 Pandas 中,使用 iloc 按索引訪(fǎng)問(wèn)每一行。通過(guò)檢查大小來(lái)確保不會(huì)超出 DataFrame 范圍。df.size 返回元素的數(shù)量,因此它將行乘以列。這就是為什么我將大小除以列數(shù)以獲得實(shí)際行數(shù)。
添加回答
舉報(bào)