为了账号安全,请及时绑定邮箱和手机立即绑定

有组织的 pandas df 列表的字典列表

有组织的 pandas df 列表的字典列表

月关宝盒 2022-07-26 16:44:20
我有一本字典:[  {     'dates': ['2019-12-01'],     'periods': ['1', '1', '1', '1']  },   {    'dates': ['2019-12-02', '2019-12-03', '2019-12-04', '2019-12-05'],     'hh_periods': ['1', '1', '1', '20']  }]理想情况下,我想建立pd.Dataframe()一个colums=["p1", "p2", "p3", "p4"]看起来像这样:           p1 p2 p3 p4dates                                                 2019-12-01  1  1  1  12019-12-02  1  1  1  202019-12-03  1  1  1  202019-12-04  1  1  1  202019-12-05  1  1  1  20对于我的用例,我需要一些快速的东西,我尝试过:p = pd.DataFrame(data).explode('dates')p.set_index('dates', inplace=True)这很接近但最终是:               hh_periodsdates                    2019-12-01   [1, 1, 1, 1]2019-12-01   [1, 1, 1, 1]2019-12-02  [1, 1, 1, 20]2019-12-03  [1, 1, 1, 20]这并不理想。 * 更新 *所以我使用了 anky_91 的答案:cols = ["dates", "p1", "p2", "p3", "p4"]p = pd.DataFrame(self.build()).explode('dates')var = p[['dates']].join(pd.DataFrame(p.ffill(axis=1).iloc[:, -1].tolist()))var.columns = cols现在返回的结果在视觉上看起来是正确的:dates          p1   p2  p3   p40  2019-12-07  1    0    0    00  2019-12-14  1    0    0    00  2019-12-07  1    0    0    00  2019-12-14  1    0    0    01  2019-12-01  1    0    0    0但是当我测试时:[ {  'dates': ['2019-12-07', '2019-12-14'],   'periods': ['333333', '0', '0', '0'] },  {  'dates': ['2019-12-01', '2019-12-08', '2019-12-15'],   'periods': ['1', '1', '333', '1'] }]我得到这样的df:        dates            p1 p2 p3 p40  2019-12-07  333333    0    0    00  2019-12-14  333333    0    0    00  2019-12-07  333333    0    0    00  2019-12-14  333333    0    0    01  2019-12-01  333333    0    0    01  2019-12-08  333333    0    0    01  2019-12-15  333333    0    0    01  2019-12-01  333333    0    0    0所以只有 p1 被捡起......:/p = pd.DataFrame(self.build()).explode('dates')print(p)按预期生成旧形式:      dates         hh_periods0  2019-12-07  [333333, 0, 0, 0]0  2019-12-14  [333333, 0, 0, 0]1  2019-12-01     [1, 1, 333, 1]1  2019-12-08     [1, 1, 333, 1]    ( ... ) 
查看完整描述

2 回答

?
炎炎设计

TA贡献1808条经验 获得超4个赞

您可以使用:


p = pd.DataFrame(data).explode('dates')

p = p[['dates']].join(pd.DataFrame(p.ffill(axis=1).iloc[:,-1].tolist())

                 .rename(columns=lambda x: f"p{x+1}"))

        dates p1 p2 p3  p4

0  2019-12-01  1  1  1   1

1  2019-12-02  1  1  1  20

1  2019-12-03  1  1  1  20

1  2019-12-04  1  1  1  20

1  2019-12-05  1  1  1  20

编辑每个新的字典列表:


p = pd.DataFrame(data).explode('dates').reset_index(drop=True)

var = p[['dates']].join(pd.DataFrame(p.ffill(axis=1).iloc[:,-1].tolist()))

#var.columns = your_list_of_columns

print(var)

        dates       0  1    2  3

0  2019-12-07  333333  0    0  0

1  2019-12-14  333333  0    0  0

2  2019-12-01       1  1  333  1

3  2019-12-08       1  1  333  1

4  2019-12-15       1  1  333  1


查看完整回答
反对 回复 2022-07-26
?
慕容森

TA贡献1853条经验 获得超18个赞

你可以用

p = p.reset_index().join(pd.DataFrame(p.hh_periods.tolist()))


查看完整回答
反对 回复 2022-07-26
  • 2 回答
  • 0 关注
  • 133 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号