首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将熊猫数据中的重复行序列进行枢轴连接?

如何将熊猫数据中的重复行序列进行枢轴连接?
EN

Stack Overflow用户
提问于 2022-02-15 09:40:06
回答 2查看 124关注 0票数 1

我有下面的数据,

代码语言:javascript
运行
复制
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

得到的数据应该是,

代码语言:javascript
运行
复制
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        NULL

CycleEnd列与Events列相关。如果它是1,那就意味着一个循环完成了。我想顺序地将每个循环结束的数据转换为数据,这样我就可以从EventValue列中获得EventValue作为列的值及其相应的值。

我的方法是从CycleEnd列创建一个CycleEnd列,方法是使用df['UniqueId'] = df['CycleEnd'].eq(1).shift().bfill().cumsum(),它分别定义每个循环。然后,循环每个唯一的Id并过滤数据,然后将所需的信息存储到一个临时的新的dataframe中,然后追加到一个列表中。终于连在一起了。

我想知道是否有其他更有效(性能方面)的方法来解决上述问题。dataframe有数十万行。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-15 09:45:13

我认为这里可能是每个组的聚合minmax日期时间,然后由DataFrame.pivot_table使用聚合函数(如meansum和last连接在一起)进行旋转:

代码语言:javascript
运行
复制
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  
票数 1
EN

Stack Overflow用户

发布于 2022-02-15 10:40:40

幸运的是,您的DataFrame有UniqueId列,它便于分组。

若要执行任务,请将处理源行组的函数定义为:

代码语言:javascript
运行
复制
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])

然后跑:

代码语言:javascript
运行
复制
wrk = df.groupby('UniqueId').apply(grpProc)
result = wrk.unstack().reindex(columns=wrk[0].index)
result.index.name=None

对于源数据,结果是:

代码语言:javascript
运行
复制
  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 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71124161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档