我有下面的数据,
MachineId Timestamp Events EventValue CycleEnd UniqueId
7 2021-11-01 20:45:17 Attr-A 50 0 0
7 2021-11-01 20:45:44 Attr-B 1000 0 0
7 2021-11-01 21:00:00 Attr-C 5 0 0
7 2021-11-01 21:03:36 End NULL 1 0
7 2021-11-01 21:11:43 Attr-B 1100 0 1
7 2021-11-01 21:11:44 Attr-C 2 0 1
7 2021-11-01 21:25:01 End NULL 1 1得到的数据应该是,
MachineId CycleId CycleStarttime CycleEndtime Attr-A Attr-B Attr-C End
7 1 2021-11-01 20:45:17 2021-11-01 21:03:36 50 1000 5 NULL
7 2 2021-11-01 21:11:43 2021-11-01 21:25:01 NULL 1100 2 NULLCycleEnd列与Events列相关。如果它是1,那就意味着一个循环完成了。我想顺序地将每个循环结束的数据转换为数据,这样我就可以从EventValue列中获得EventValue作为列的值及其相应的值。
我的方法是从CycleEnd列创建一个CycleEnd列,方法是使用df['UniqueId'] = df['CycleEnd'].eq(1).shift().bfill().cumsum(),它分别定义每个循环。然后,循环每个唯一的Id并过滤数据,然后将所需的信息存储到一个临时的新的dataframe中,然后追加到一个列表中。终于连在一起了。
我想知道是否有其他更有效(性能方面)的方法来解决上述问题。dataframe有数十万行。谢谢!
发布于 2022-02-15 09:45:13
我认为这里可能是每个组的聚合min和max日期时间,然后由DataFrame.pivot_table使用聚合函数(如mean、sum和last连接在一起)进行旋转:
df['UniqueId'] = df['CycleEnd'].eq(1).shift().bfill().cumsum().add(1)
df1 = (df.groupby(['MachineId','UniqueId'])
.agg(CycleStarttime=('Timestamp','min'), CycleEndtime=('Timestamp','max')))
df2 = df.pivot_table(index=['MachineId','UniqueId'],
columns='Events',
values='EventValue',
aggfunc='sum')
df = df1.join(df2).rename_axis(['MachineId','CycleId']).reset_index()
print (df)
MachineId CycleId CycleStarttime CycleEndtime Attr-A Attr-B \
0 7 1 2021-11-01 20:45:17 2021-11-01 21:03:36 50.0 1000.0
1 7 2 2021-11-01 21:11:43 2021-11-01 21:25:01 NaN 1100.0
Attr-C End
0 5.0 NaN
1 2.0 NaN 发布于 2022-02-15 10:40:40
幸运的是,您的DataFrame有UniqueId列,它便于分组。
若要执行任务,请将处理源行组的函数定义为:
def grpProc(grp):
rv1 = pd.Series([grp.MachineId.iloc[0], grp.UniqueId.iloc[0] + 1,
grp.Timestamp.iloc[0], grp.Timestamp.iloc[-1]],
index=['MachineId', 'CycleId', 'CycleStarttime', 'CycleEndtime'])
rv2 = grp[:-1].pivot(index='MachineId', columns='Events',
values='EventValue').iloc[0]
return pd.concat([rv1, rv2])然后跑:
wrk = df.groupby('UniqueId').apply(grpProc)
result = wrk.unstack().reindex(columns=wrk[0].index)
result.index.name=None对于源数据,结果是:
MachineId CycleId CycleStarttime CycleEndtime Attr-A Attr-B Attr-C
0 7 1 2021-11-01 20:45:17 2021-11-01 21:03:36 50 1000 5
1 7 2 2021-11-01 21:11:43 2021-11-01 21:25:01 NaN 1100 2 https://stackoverflow.com/questions/71124161
复制相似问题