python - 有组织的 pandas df 列表的字典列表
问题描述
我有一本字典:
[
{
'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 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
对于我的用例,我需要一些快速的东西,我尝试过:
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:
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 = 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
推荐阅读
- java - Spring Data MongoDB 有时会截断大字符串
- python - 返回 x 天前的日期的 Python 函数
- ruby-on-rails - Rails ActiveAdmin:ActiveRecord::RecordNotFound in Admin::UsersController#show
- python - 为什么在向 api/url 发出请求后不能打印响应?
- python-3.x - 如何在 for 循环中迭代时比较和更新数据帧值
- stripe-payments - 条纹连接。将付款转帐到已连接的帐户会在主帐户上收取费用
- android - 在 Android Studio 中禁用屏幕截图
- excel - 使用 VBA 重新格式化图像颜色
- reactjs - react 聊天引擎中的 renderChatFeed 属性正在渲染自定义聊天提要组件的无限循环
- android - SciChart如何在Android上为{textAlignment:left}属性设置setAxisTickLabelStyle?