【发布时间】:2020-01-31 20:52:33
【问题描述】:
我正在尝试使用 pandas 聚合一些数据,以便创建两个新列来存储来自原始数据集的值,以减少总行数。
例如
d = pd.DataFrame([['0001', None, 'backlog', '2020-01-15', '2020-01-31'],
['0001', 'backlog', 'complete', '2020-01-31', '9999-12-31'],
['0001', 'backlog', 'complete', '2020-01-31', '9999-12-31'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', 'backlog', 'complete', '2019-02-25', '9999-12-31'],
['0003', None, 'backlog', '2020-01-15', '2020-01-31'],
['0003', None, 'backlog', '2020-01-15', '2020-01-31'],
['0003', None, 'backlog', '2020-01-15', '2020-01-31'],
['0003', 'backlog', 'modified', '2020-01-31', '2020-02-05'],
['0003', 'modified', 'qe_backlog', '2020-02-05', '2020-02-20'],
['0003', 'qe_backlog', 'verified', '2020-02-20', '9999-12-31']] ,
columns=['id', 'old_state', 'new_state', 'start_dttm', 'end_dttm'])
结果
id old_state new_state start_dttm end_dttm
0 0001 None backlog 2020-01-15 2020-01-31
1 0001 backlog complete 2020-01-31 9999-12-31
2 0001 backlog complete 2020-01-31 9999-12-31
3 0002 None backlog 2019-02-15 2019-02-25
4 0002 None backlog 2019-02-15 2019-02-25
5 0002 None backlog 2019-02-15 2019-02-25
6 0002 None backlog 2019-02-15 2019-02-25
7 0002 backlog complete 2019-02-25 9999-12-31
8 0003 None backlog 2020-01-15 2020-01-31
9 0003 None backlog 2020-01-15 2020-01-31
10 0003 None backlog 2020-01-15 2020-01-31
11 0003 backlog modified 2020-01-31 2020-02-05
12 0003 modified qe_backlog 2020-02-05 2020-02-20
13 0003 qe_backlog verified 2020-02-20 9999-12-31
最后我想要的是:
id state backlog_dttm completed_dttm modified_dttm qe_backlog_dttm verified_dttm
0001 complete 2020-01-15 2020-01-31 null null null
0002 complete 2019-02-15 2019-02-25 null null null null
0003 verified 2020-01-15 null 2020-01-31 2020-02-05 2020-02-20
目前为止
d.drop_duplicates(subset=d.columns, keep='last', inplace=True)
d.set_index('id', inplace=True)
然后在这一点上,尝试设置 backlog_dttm,事情停止工作。
d2['backlog_dttm'] = d[d['old_state'].isnull() & (d['new_state'] == 'backlog')]['start_dttm']
d2 = d.loc[d['end_dttm'] == d.end_dttm.max()]
d2.loc[d2.index,'backlog_dttm'] = d[d['old_state'].isnull() & (d['new_state'] == 'backlog')]['start_dttm']
d2.loc[d2.index, 'completed_dttm'] = d[d['new_state'] == 'complete']['start_dttm']
d2.loc[d2.index, 'modified_dttm'] = d[d['new_state'] == 'modified']['start_dttm']
d2.loc[d2.index, 'qe_backlog_dttm'] = d[d['new_state'] == 'qe_backlog']['start_dttm']
上述结果会导致 SettingWithCopyWarning,但似乎有效。最终所需的输出应类似于以下内容:
old_state new_state start_dttm end_dttm backlog_dttm \
id
0001 backlog complete 2020-01-31 9999-12-31 2020-01-15
0002 backlog complete 2019-02-25 9999-12-31 2019-02-15
0003 qe_backlog verified 2020-02-20 9999-12-31 2020-01-15
completed_dttm modified_dttm qe_backlog_dttm
id
0001 2020-01-31 NaN NaN
0002 2019-02-25 NaN NaN
0003 NaN 2020-01-31 2020-02-05
作为一个仅供参考:这只是一个示例,真正的数据集基于开发工作流程,其中会有其他状态,如 ready_to_test、verified、in_progress 等......同样会有我需要填充的列这些状态也是如此,即verified_dttm,read_to_test_dttm..
start_dttm 和 end_dttm 字段用于标识记录进入给定状态的日期和离开该状态的日期。
感谢任何想法/建议。 -谢谢!
【问题讨论】:
标签: python pandas dataframe merge blending