简体   繁体   English

列表的字典列表到有组织的熊猫 df

[英]List of dictionaries of lists into organised pandas df

I have a dictionary:我有一本字典:

[
  { 
    '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']
  }
]

Ideally, I would like to build a pd.Dataframe() with colums=["p1", "p2", "p3", "p4"]理想情况下,我想用colums=["p1", "p2", "p3", "p4"]构建一个pd.Dataframe()

That would look like this:那看起来像这样:

           p1 p2 p3 p4
dates                                                 
2019-12-01  1  1  1  1
2019-12-02  1  1  1  20
2019-12-03  1  1  1  20
2019-12-04  1  1  1  20
2019-12-05  1  1  1  20

For my use case I need something fast, I have tried:对于我的用例,我需要一些快速的东西,我尝试过:

p = pd.DataFrame(data).explode('dates')
p.set_index('dates', inplace=True)

Which is close but ends up with:这很接近,但最终是:

               hh_periods
dates                    
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]

Which is not ideal.这并不理想。 * UPDATE * * 更新 *

So I have used anky_91 answer of:所以我使用了 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

Now this returns which visually looks correct:现在这将返回视觉上看起来正确的:

dates          p1   p2  p3   p4
0  2019-12-07  1    0    0    0
0  2019-12-14  1    0    0    0
0  2019-12-07  1    0    0    0
0  2019-12-14  1    0    0    0
1  2019-12-01  1    0    0    0

But when I test with:但是当我测试时:

[
 {
  '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']
 }
]

I get a df like this:我得到这样的 df:

        dates            p1 p2 p3 p4
0  2019-12-07  333333    0    0    0
0  2019-12-14  333333    0    0    0
0  2019-12-07  333333    0    0    0
0  2019-12-14  333333    0    0    0
1  2019-12-01  333333    0    0    0
1  2019-12-08  333333    0    0    0
1  2019-12-15  333333    0    0    0
1  2019-12-01  333333    0    0    0

So only p1 is getting picked up... :/所以只有 p1 被拾取......:/

p = pd.DataFrame(self.build()).explode('dates')
print(p)

Produces the old form as expected :按预期生成旧形式:

      dates         hh_periods
0  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]

    ( ... ) 

你可以用

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

You can use:您可以使用:

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

EDIT per new list of dicts:编辑每个新的字典列表:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM