python - 按任务将熊猫数据框行拆分为多行
问题描述
我有一个熊猫数据框,想将包含多个任务的每一行拆分为一个新行。
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。
解决方案
如果我们假设每个任务都有一个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
推荐阅读
- python - pytest——版本错误
- getstream-io - 如何加入 GetStream Feed 组?
- python-3.x - 使用字符串连接参数化的 Sparql 查询
- regex - 如何使用单个字符替换多个数字
- django - Django 表 - 行中的数据
- jsf - Java JSF 和 Bean 连接的问题
- powershell - How to pass powershell parameters into Chef
- reactjs - componentDidMount 没有渲染所有内容
- javascript - 在 React 中测试 Paypal 按钮(茉莉和酶)
- scala - 如何从 Scala 中的特征访问类型成员