首页 > 解决方案 > 将锯齿状数组转换为 Pandas 数据框

问题描述

我正在尝试获得一个看起来像这样的锯齿状 2D 列表

l = [
    [(1, 0.8656769), (2, 0.08902887), (5, 0.040293545)],
    [(1, 0.5918752), (2, 0.04440181), (4, 0.05204634), (5, 0.3066661)],
    [(1, 0.26327166), (2, 0.26078925), (4, 0.24160784), (5, 0.22958432)],
    [(2, 0.92498404), (5, 0.065140516)],
    [(1, 0.9882947)],
    [(0, 0.23412614), (1, 0.031903207), (2, 0.03044448), (3, 0.6480669), (4, 0.053342175)],
    [(0, 0.056099385), (3, 0.9084766), (5, 0.031809118)],
    [(2, 0.39833495), (4, 0.52058107), (5, 0.077259734)],
    [(0, 0.46812743), (1, 0.10643007), (3, 0.15962379), (4, 0.017917762), (5, 0.24552101)],
    [(0, 0.2556301), (1, 0.7391994)]
]

成为如下所示的数据框:

在此处输入图像描述

l中,每一行可能包含也可能不包含所有列。每个元组的结构如下(column_label, cell_value)。如果该行缺少一列,则其值应在数据框中设置为 0。

我试过了

topics_df = pd.DataFrame(l).fillna(0)

但这会导致数据框如下所示:

在此处输入图像描述

标签: pythonpandasjagged-arrays

解决方案


让我们尝试格式化列表以 dict 哪个熊猫数据框可以识别

df = pd.DataFrame(dict(enumerate(list(map(dict,l))))).T.sort_index(axis=1).fillna(0)
Out[17]: 
          0         1         2         3         4         5
0  0.000000  0.865677  0.089029  0.000000  0.000000  0.040294
1  0.000000  0.591875  0.044402  0.000000  0.052046  0.306666
2  0.000000  0.263272  0.260789  0.000000  0.241608  0.229584
3  0.000000  0.000000  0.924984  0.000000  0.000000  0.065141
4  0.000000  0.988295  0.000000  0.000000  0.000000  0.000000
5  0.234126  0.031903  0.030444  0.648067  0.053342  0.000000
6  0.056099  0.000000  0.000000  0.908477  0.000000  0.031809
7  0.000000  0.000000  0.398335  0.000000  0.520581  0.077260
8  0.468127  0.106430  0.000000  0.159624  0.017918  0.245521
9  0.255630  0.739199  0.000000  0.000000  0.000000  0.000000

推荐阅读