【发布时间】:2025-12-03 16:50:02
【问题描述】:
我想使用 groupby().transform() 对(排序的)数据集中的每个记录块进行自定义(累积)转换。除非我确保我有一个唯一的密钥,否则它不起作用。为什么?
这是一个玩具示例:
df = pd.DataFrame([[1,1],
[1,2],
[2,3],
[3,4],
[3,5]],
columns='a b'.split())
df['partials'] = df.groupby('a')['b'].transform(np.cumsum)
df
给出预期:
a b partials
0 1 1 1
1 1 2 3
2 2 3 3
3 3 4 4
4 3 5 9
但如果 'a' 是一个键,那么一切都会出错:
df = df.set_index('a')
df['partials'] = df.groupby(level=0)['b'].transform(np.cumsum)
df
---------------------------------------------------------------------------
Exception Traceback (most recent call last)
<ipython-input-146-d0c35a4ba053> in <module>()
3
4 df = df.set_index('a')
----> 5 df.groupby(level=0)['b'].transform(np.cumsum)
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/groupby.pyc in transform(self, func, *args, **kwargs)
1542 res = wrapper(group)
1543 # result[group.index] = res
-> 1544 indexer = self.obj.index.get_indexer(group.index)
1545 np.put(result, indexer, res)
1546
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/pandas/core/index.pyc in get_indexer(self, target, method, limit)
847
848 if not self.is_unique:
--> 849 raise Exception('Reindexing only valid with uniquely valued Index '
850 'objects')
851
Exception: Reindexing only valid with uniquely valued Index objects
如果您在分组之前选择列“b”也会出现同样的错误,即。
df['b'].groupby(level=0).transform(np.cumsum)
但如果你转换整个数据框,你可以让它工作,比如:
df.groupby(level=0).transform(np.cumsum)
甚至是单列数据框(而不是系列):
df.groupby(level=0)[['b']].transform(np.cumsum)
我觉得GroupBy-fu 的某些深层部分我仍然缺少。谁能直截了当?
【问题讨论】:
-
是的,这就是我想要的——“a”组中“b”的部分总和。我澄清了上面的插图。在我的实际示例中,'a' 是时间戳,b 是其他一些键,因此我的数据集实际上是不同长度的时间序列的集合(它们在时间上重叠并包含组内和组间的重复时间戳)。我正在使用 transform() 对每个时间序列段进行累积操作,例如移动平均线等。