我正在设计一个类似于 GatherBy 的函数在数学中。我认为通过在 Pandas 中修饰 groupby
函数可以轻松完成。此函数将按某些给定的特征函数对列表进行分组。
设置
time1 = pd.date_range(start=datetime.datetime(2015, 1, 30), end=datetime.datetime(2015, 2, 5))
datedat = np.array([time1, 0.1 * numpy.arange(7), 0.2 * numpy.arange(7)]).T
print(datedat)
array([[Timestamp('2015-01-30 00:00:00', freq='D'), 0.0, 0.0],
[Timestamp('2015-01-31 00:00:00', freq='D'), 0.1, 0.2],
[Timestamp('2015-02-01 00:00:00', freq='D'), 0.2, 0.4],
[Timestamp('2015-02-02 00:00:00', freq='D'), 0.3,
0.6],
[Timestamp('2015-02-03 00:00:00', freq='D'), 0.4, 0.8],
[Timestamp('2015-02-04 00:00:00', freq='D'), 0.5, 1.0],
[Timestamp('2015-02-05 00:00:00', freq='D'), 0.6,
1.2]], dtype=object)
假设我想按年和月分组——你看有1月和2月的数据。于是我设计了一个特征函数:
gatherf = lambda x: ((x[0].year)*1000+x[0].month)
对于每个时间数据记录,此 gatherf
将为 groupby
计算一个值来区分时间。
目标
我的最终目标是开发一个函数gather_by
,通过该函数
gather_by(datedat, gatherf)
应该生成这个:
array([[[Timestamp('2015-01-30 00:00:00', freq='D'), 0.0, 0.0],
[Timestamp('2015-01-31 00:00:00', freq='D'), 0.1, 0.2]],
[[Timestamp('2015-02-01 00:00:00', freq='D'), 0.2, 0.4],
[Timestamp('2015-02-02 00:00:00', freq='D'), 0.3,
0.6],
[Timestamp('2015-02-03 00:00:00', freq='D'), 0.4, 0.8],
[Timestamp('2015-02-04 00:00:00', freq='D'), 0.5, 1.0],
[Timestamp('2015-02-05 00:00:00', freq='D'), 0.6,
1.2]]], dtype=object)
我的努力
一般情况下,datedat
的列数可能多于 3 列。我无法将它们一一分组。所以我尝试了:
datedatF2 =pandas.DataFrame({'dat':datedat,'gather_key':numpy.array(list(map(gatherf, datedat)))})
与
groupedall=datedatF2['dat'].groupby(datedatF2['gather_key'])
但这会导致数据必须是一维
错误。我该怎么办?
最佳答案
输入 -
日期
array([[Timestamp('2015-01-30 00:00:00', freq='D'), 0.0, 0.0],
[Timestamp('2015-01-31 00:00:00', freq='D'), 0.1, 0.2],
[Timestamp('2015-02-01 00:00:00', freq='D'), 0.2, 0.4],
[Timestamp('2015-02-02 00:00:00', freq='D'), 0.3, 0.6],
[Timestamp('2015-02-03 00:00:00', freq='D'), 0.4, 0.8],
[Timestamp('2015-02-04 00:00:00', freq='D'), 0.5, 1.0],
[Timestamp('2015-02-05 00:00:00', freq='D'), 0.6, 1.2]], dtype=object)
聚集
lambda x: ((x[0].year) * 1000 + x [0].month)
一种基于当前方法的非常可靠分组方法是将自定义列表/键传递给groupby
(分组谓词不需要属于数据帧! ) -
key = list(map(gatherf, datedat))
r = []
for _, g in pd.DataFrame(datedat).groupby(key):
r.append(g.values.tolist())
或者,作为列表理解 -
r = [g.values.tolist() for _, g in pd.DataFrame(datedat).groupby(key)]
np.array(r)
[[[Timestamp('2015-01-30 00:00:00', freq='D'), 0.0, 0.0],
[Timestamp('2015-01-31 00:00:00', freq='D'), 0.1, 0.2]],
[[Timestamp('2015-02-01 00:00:00', freq='D'), 0.2, 0.4],
[Timestamp('2015-02-02 00:00:00', freq='D'), 0.3, 0.6],
[Timestamp('2015-02-03 00:00:00', freq='D'), 0.4, 0.8],
[Timestamp('2015-02-04 00:00:00', freq='D'), 0.5, 1.0],
[Timestamp('2015-02-05 00:00:00', freq='D'), 0.6, 1.2]]]
这也应该适用于任意数量的列,前提是 gatherf
被适本地编写为匹配。
关于python - 使用 Pandas groupby 的 Mathematica GatherBy 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48182882/