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外观正确,但测试还不太理想-让我更新我的问题: