python - 使用 Pandas groupby 的 Mathematica GatherBy 函数

标签 python pandas dataframe group-by pandas-groupby

我正在设计一个类似于 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/

相关文章:

r - 通过匹配两行合并不相等的数据帧并用 0 替换 R 中的缺失值

r - 将列表行转置为数据框

python - 两个日期之间的工作日,不包括 python 中的假期

python - 在 Python 中有类似于 Java 的 Thread.yield() 的东西吗?这有意义吗?

Python ASCII 图形绘图

python - 对列名进行分组/取消堆叠

r - 计算某个元素在 data.frame 的列中出现的次数

python - 在python中遍历列表的最有效方法是什么?

python - 如何在 Pandas 中创建数据框 View ?

python - 如何根据条件表达式删除一定数量的行?