我有一个表示时间序列数据的熊猫数据框。我有一个名为DTDate(日期时间日期)的列和一个名为line_code(这是观察单位 - 它恰好是工厂中的生产线)的列。我有很多列的数据,但为了这个问题,可以想象只有三个:使用GroupBy熊猫折叠数据
工人 - 生产线上的工人数量。 item - 在生产线上生产的物品的名称。 输出 - 生产线上物料的输出量。
某些日子每行只产生一个项目,有时多个项目。因此,有时每个DTDate/line_code有一个观测值,有时会有多个观测值。我需要将每个DTDate/line_code的数据集合合并为一个观察值。
这里是蹭 - 我们还不知道我们想如何聚合数据,因此目前我只需要实现一个结构,我们可以尝试多个聚合方法。 当行只产生一个项目时,我只需要保留数据行就这样。当线条在给定的DTDate上生成多个项目时,我想根据以下内容将观察结果合并为一个观察值:
工人:如果在DTDate/line_code观察值中工人数量相等,则单个值的工作人员正在进入崩溃的集合。如果数字操作员不相等,则创建一个列表对象,其中包含DTDate/line_code观察值内的所有工作值。 item:项目的列表对象被转发到折叠后的集合。 输出:输出的列表对象被转发到折叠后的集合。
通过让折叠集中的列表项目,我将足够灵活地离开结构,从而让我自己能够对每个列进行不同的聚合方法实验,并且当我被指示达到这种效果时。
SOFAR我已经将数据分组如下:
import pandas as pd
import numpy as np
from pandas import DataFrame
DF = DataFrame(mydata, columns = ['DTDate', 'line_code', \
'workers', 'item', 'output'])
DFGrouped = DF.groupby(['DTDate', 'line_code'])
现在我认识到我所想要做的是以下几点:
DFAggregated = DFGrouped.agg({'DTDate': max(), 'line_code' : max(), \
'workers' : myfunc1, 'item' : myfunc2, \
'output' : myfunc2})
其中: myfunc1评估中如果所有值指定的列的组是相等的,如果它们是则返回单个值,如果不是,则返回每个值的列表。
myfunc2返回指定列内组中所有值的列表。
我的问题是,我没有idead如何编写这些函数,很大程度上,因为我不清楚如何遍历组特定的索引/行。我已阅读关于grouby等的python文档,但发现它不是非常有用。我意识到我应该发布更多我尝试过的代码,但我很难在这里站稳脚跟。任何指针将不胜感激。
(现在延伸到给说明性功能代码)
Incidentall我希望myfunc1和myfunc2所看起来是这样的:
def myfunc1(ColName):
if len(set([DFGroup[ColName][x] for x in DFGroup.index])) == 1:
return DFGroup[ColName].max()
else:
return [DFGroup[ColName][x] for x in DFGroup.index]
def myfunc2(ColName):
return [DFGroup[ColName][x] for x in DFGroup.index]
,你可以看到,我不知道如何来指代团体索引等
其中参数x是列int int DF?谢谢这是有帮助的。看来我不需要实际遍历每个组中的索引。如果有必要的话,会怎么做?应用程序似乎也可能有用,而且似乎也以同样的方式用于保密。我现在看看。非常感谢。 –
@WoodyPride:正如我所说的,函数的参数(在我的例子中是'x')是一个包含列数据的pandas Series。您可以像对待任何Series一样对它迭代或做任何事情。 – BrenBarn
明白了,谢谢! –