我在创建一个可以执行嵌套循环的递归函数时遇到了问题。下面是一个例子。假设我有一个数据帧如下:
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()