2 回答
TA贡献1993条经验 获得超5个赞
我很少为 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 返回元素的数量,因此它将行乘以列。这就是为什么我将大小除以列数以获得实际行数。
添加回答
举报