Python 词典列表将列表分为多个部分

Python 词典列表将列表分为多个部分,python,python-3.x,pandas,Python,Python 3.x,Pandas,我有一本字典: [ { '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'] } ] 理想情况下,我想用colums=[p1,p2,p3,p4]构建一个pd.Data

我有一本字典:

[
  { 
    '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']
  }
]
理想情况下,我想用colums=[p1,p2,p3,p4]构建一个pd.Dataframe

看起来是这样的:

           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

        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
对于我的用例,我需要一些快速的东西,我已经尝试过:

p = pd.DataFrame(data).explode('dates')
p.set_index('dates', inplace=True)
虽然很接近,但最终的结果是:

               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]

这并不理想。 *更新*

所以我用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   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
但当我测试时:

[
 {
  '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如下:

           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

        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
所以只有p1被抓到了…:/

p = pd.DataFrame(self.build()).explode('dates')
print(p)
按预期生成旧表单:

      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()))

你可以用

p = p.reset_index().join(pd.DataFrame(p.hh_periods.tolist()))
您可以使用:

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}"))
根据新目录列表编辑:

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)
您可以使用:

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}"))
根据新目录列表编辑:

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)

好的,很酷,但是我该如何将列表值分解为它们自己的col?好的,很酷,但是我该如何将列表值分解为它们自己的col?谢谢,如果我想从固定列表中命名col,我该怎么做?@Alex在加入var=pd.DataFramep.ffillaxis=1.iloc[:-1].tolist之前保存一个变量,然后将列命名为var.columns=fixed_list,然后加入p['dates']]。joinvar?我似乎得到了:value错误:列重叠但没有指定后缀:Index['dates'],dtype='object'@Alex我明白了,这意味着你的固定列表也有日期。在这种情况下,save var=p['dates'].joinpd.DataFramep.ffillaxis=1.iloc[:,-1].tolist,var.columns=fixed\u list然后print varok外观正确,但测试看起来还不太好-让我更新我的问题:谢谢,如果我想从固定列表中命名col,我该怎么做?@Alex在加入var=pd.DataFramep.ffillaxis=1.iloc[:,-1].tolist之前先保存一个变量,然后将列命名为var.columns=fixed\u list,然后加入p['dates'].joinvar?我似乎得到了:ValueError:列重叠但没有指定后缀:Index['dates',dtype='object这意味着你的固定列表也有日期。在这种情况下,save var=p['dates'].joinpd.DataFramep.ffillaxis=1.iloc[:,-1].tolist,var.columns=fixed\u list然后print varok外观正确,但测试还不太理想-让我更新我的问题: