首页 > 解决方案 > Python:如何将 Pandas Dataframe 行值转换为单个列?

问题描述

我有以下数据框,其中包含不同时间间隔的不同作业开始和结束时间的数据。数据框的一小部分如下所示。

数据框(df):

result | job   |  time
START  | JOB0  |  1357  
START  | JOB2  |  2405
END    | JOB2  |  2379
START  | JOB3  |  4010
END    | JOB0  |  5209
END    | JOB3  |  6578
START  | JOB0  |  6000
END    | JOB0  |  6100

(注意 - 原始数据框有 5 个作业(JOB0 到 JOB4)我想将列的值(STARTEND)转换为数据框中的result单个列。

所需数据帧(df2)

job  |  START  | END
JOB0 |  1357   | 5209
JOB2 |  2405   | 2379
JOB3 |  4010   | 6578
JOB0 |  6000   | 6100

代码
我尝试使用 a 来实现pivot_table它,但它给出了不需要的聚合值。

df2 = df.pivot_table('time', 'job','result')

代码输出

result |       END       |      START
job     
JOB0   |    5.000589e+08    5.000636e+08
JOB1   |    4.999141e+08    4.999188e+08
JOB2   |    5.001668e+08    5.001715e+08
JOB3   |    4.995190e+08    4.995187e+08
JOB4   |    5.003238e+08    5.003236e+08

如何获得所需的数据框?

标签: pythonpandasdataframepandas-groupbypivot-table

解决方案


您有重复jobJOB0有 2 个不同的开始和结束时间),因此您还需要按累积计数(groupby.cumcount)进行旋转,因此索引是唯一的。之后,您可以通过降低累积计数水平来整理枢轴。

df['idx'] = df.groupby(['job', 'result']).cumcount()

(df.pivot(index=['job', 'idx'], columns='result', values='time')
  .sort_index(level=1)
  .droplevel(1)
  .reset_index()
  .rename_axis(None, axis=1)[['job', 'START', 'END']])

[出去]

    job  START   END
0  JOB0   1357  5209
1  JOB2   2405  2379
2  JOB3   4010  6578
3  JOB0   6000  6100

推荐阅读