首页 > 解决方案 > 按任务将熊猫数据框行拆分为多行

问题描述

我有一个熊猫数据框,想将包含多个任务的每一行拆分为一个新行。

The dataframe columns are:
start_t_i = start time of a task.
end_t_i = end time of a task.
weight_i = cost of a task.

例如,假设我有以下数据框 df1:

任务名称 开始_t1 end_t1 重量_1 开始_t_2 end_t2 重量_2.. start_t_k end_t_k weight_k
约翰 5 7 1 9 10 9
莎莉 3 4 1 8 11 7 19 21 1
汤姆 1 2 3

我想将其转换为以下df2:

任务名称 开始时间 end_t 重量
约翰 5 7 1
约翰 9 10 9
莎莉 3 4 1
莎莉 8 11 7
莎莉 19 21 1
汤姆 1 2 3

到目前为止,通过假设每个人最多只有两个任务,我设法将 df1 手动转换为 df2。我的问题是,当每个人最多有 k 个任务时,如何从 df1 获得诸如 df2 之类的 df。

标签: pythonpandasdataframedata-analysisdata-cleaning

解决方案


如果我们假设每个任务都有一个start_t, end_t and weight_t列,那么我们可以使用:

cols = list(df.columns[1:])
task_col = df.columns[0]
dfs = []
for i in range(0, len(cols), 3):
    subset_cols = cols[i:i+3]
    rename_cols = {subset_cols[0]: 'start_t', subset_cols[1]:'end_t', subset_cols[2]:'weight'}
    dfs.append(df[[task_col] + subset_cols].rename(columns=rename_cols))

transformed_df = pd.concat(dfs, ignore_index=True).sort_values(by='task_name').dropna(subset=['start_t', 'end_t', 'weight']).reset_index(drop=True)

输出:

  task_name  start_t  end_t  weight
0      john      5.0    7.0     1.0
1      john      9.0   10.0     9.0
2     sally      3.0    4.0     1.0
3     sally      8.0   11.0     7.0
4     sally     19.0   21.0     1.0
5       tom      1.0    2.0     3.0

推荐阅读