尝试将多行中的列值融合/合并到单行中

问题描述 投票:0回答:1

我正在尝试通过熊猫聚合一些数据,以便创建两个新列来存储原始数据集中的值,以减少总行数。

例如

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。

任何想法/建议都值得赞赏。 -谢谢!

python pandas dataframe merge blending
1个回答
0
投票

如果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
© www.soinside.com 2019 - 2024. All rights reserved.