我正在尝试通过熊猫聚合一些数据,以便创建两个新列来存储原始数据集中的值,以减少总行数。
例如
d = pd.DataFrame([['0001', None, 'backlog', '2020-01-15', '2020-01-31'],
['0001', 'backlog', 'complete', '2020-01-31', '9999-12-31'],
['0002', None, 'backlog', '2019-02-15', '2019-02-25'],
['0002', 'backlog', 'complete', '2019-02-25', '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 0002 None backlog 2019-02-15 2019-02-25
3 0002 backlog complete 2019-02-25 9999-12-31
最后我想要的是:
id state backlog_dttm completed_dttm
0001 complete 2020-01-15 2020-01-31
0002 complete 2019-02-15 2019-02-25
到目前为止,我有
d.set_index('id', inplace=True)
d2 = d.loc[d['end_dttm'] == '9999-12-31']
然后,此时尝试设置backlog_dttm,事情就停止了。
d2['backlog_dttm'] = d[d['old_state'].isnull() & (d['new_state'] == 'backlog')]['start_dttm']
以上结果是我希望通过将索引设置为id
列来避免的SettingWithCopyWarning。
任何想法/建议都值得赞赏。 -谢谢!
如果old_state
中的[None, backlog]
和new_state
中的[backlog, completed]
,则>
您可以使用以下方法破解解决方案
df[df['old_state'].isna()].assign(old_state='complete').drop('new_state', axis=1).rename(columns={'old_state': 'state', 'start_dttm': 'backlog_dttm', 'end_dttm': 'completed_dttm'})
id state backlog_dttm completed_dttm 0 0001 complete 2020-01-15 2020-01-31 2 0002 complete 2019-02-15 2019-02-25