Python:如何将 Pandas Dataframe 行值转换为单独的列?
Python: How to convert Pandas Dataframe Row Values to individual columns?
我有以下数据框,其中包含不同作业开始和结束时间在不同时间间隔的数据。 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)
我想将列 result
的值(START
和 END
)转换为数据框中的单独列。
所需的数据帧(df2)
job | START | END
JOB0 | 1357 | 5209
JOB2 | 2405 | 2379
JOB3 | 4010 | 6578
JOB0 | 6000 | 6100
代码
我尝试使用 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
如何获得所需的数据框?
您有重复的 job
(JOB0
有 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
如果作业是唯一的,即每个作业只有 1 个开始条目和 1 个结束条目,那么您可以使用它。否则使用 Chris A
的答案
df.pivot_table(index=['job'], columns=['result'], values=['time'], aggfunc=np.max)
我有以下数据框,其中包含不同作业开始和结束时间在不同时间间隔的数据。 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)
我想将列 result
的值(START
和 END
)转换为数据框中的单独列。
所需的数据帧(df2)
job | START | END
JOB0 | 1357 | 5209
JOB2 | 2405 | 2379
JOB3 | 4010 | 6578
JOB0 | 6000 | 6100
代码
我尝试使用 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
如何获得所需的数据框?
您有重复的 job
(JOB0
有 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
如果作业是唯一的,即每个作业只有 1 个开始条目和 1 个结束条目,那么您可以使用它。否则使用 Chris A
的答案df.pivot_table(index=['job'], columns=['result'], values=['time'], aggfunc=np.max)