如何在Python中的递归函数中包含嵌套的数据帧逐循环



我在创建一个可以执行嵌套循环的递归函数时遇到了问题。下面是一个例子。假设我有一个数据帧如下:

col1 col2 col3 col4
A    1    Y    10
A    1    Y    19
A    1    N    20
A    2    Y    21
A    3    N    22
C    3    N    23

我想把col1,col2,col3分组,然后计算col4的和。一个正常的代码块应该是这样的。

for code,val in df.groupby(by='col1'):
for codee,vall in val.groupby(by='col2'):
for codeee,valll in vall.groupby(by='col3):
answer=sum(valll['col4'])

但我想创建一个递归函数来完成这项任务。这是我到目前为止得到的。

real=[]
def groupby_recurse(data, levels):
layer = len(levels)
if layer >= 1:
for code, val in data.groupby(by=levels[-layer]):
groupby_recurse(val, levels[(-layer + 1):])
else:
real.append(sum(data['col4']))
return real
df = pd.DataFrame([['A', 1, 'Y', 10], ['A', 1, 'Y', 19], ['A', 1, 'N', 20], ['A', 2, 'Y', 21],
['A', 2, 'Y', 22], ['C', 3, 'N', 23]], columns=['col1', 'col2', 'col3', 'col4'])
groupby_recurse(df, ['col1', 'col2', 'col3'])

此函数存在严重问题。当layer=2,-layer+1=-1时,我在groupby键列表的最后一个元素,但进入下一轮,当layer=1,-layer+1=0时,它突然跳到groupby键名单的第一个元素,并永远继续。如何解决此问题?

非常感谢您的帮助。干杯

预期的输出是一个包含所有和值的列表。第一个值是29。因为在对所有三列进行分组后,df看起来像这个

col1 col2 col3 col4
A    1    Y    10
A    1    Y    19

下一个是20,因为分组后df看起来是这样的。

col1 col2 col3 col4
A    1    N    20

然后是21。

col1 col2 col3 col4
A    2    Y    21

最终结果为[29,20,21,22,23]。希望这是有道理的。

您不需要递归,只需执行:

df = df.groupby(['col1', 'col2', 'col3'])['col4'].sum().reset_index()

最新更新