从具有不等长度和 NaN 值的列表列表创建 pandas 数据框

Create pandas dataframe from list of lists with unequal lengths and NaN values

鉴于以下情况:

a = [
    [1],
    [1, 2],
    [1, 2, 3],
    [],
    [1, 2, 3, 4],
    np.nan,
    [1, 2, 3, 4, 5],
]

如何着手创建:

import pandas as pd
import numpy as np
n = np.nan
# to this
n = np.nan
dt = pd.DataFrame(
    {
        "col_1": [1, 1, 1, n, 1, n, 1],
        "col_2": [n, 2, 2, n, 2, n, 2],
        "col_3": [n, n, 3, n, 3, n, 3],
        "col_4": [n, n, n, n, 4, n, 4],
        "col_5": [n, n, n, n, n, n, 5],
    }
)

尝试

以下似乎有效:

s = pd.Series([x if str(x) != "nan" else [] for x in a])

s.astype(str).str.split(",", expand=True).applymap(
    lambda x: str(x).replace("[", "").replace("]", "")
).rename(columns=lambda x: f"col_{x+1}")

但感觉不是很地道。

试试这个:

result=pd.DataFrame()
for sub in a:
    result = result.append([sub])

此代码将每个子列表添加为一行

输出:

|    |   0 |   1 |   2 |   3 |   4 |
|---:|----:|----:|----:|----:|----:|
|  0 |   1 | nan | nan | nan | nan |
|  0 |   1 |   2 | nan | nan | nan |
|  0 |   1 |   2 |   3 | nan | nan |
|  0 | nan | nan | nan | nan | nan |
|  0 |   1 |   2 |   3 |   4 | nan |
|  0 | nan | nan | nan | nan | nan |
|  0 |   1 |   2 |   3 |   4 |   5 |

只需将所有列表元素设为列表即可:

pd.DataFrame([x if isinstance(x, list) else [x] for x in a])

要重命名原始示例中给出的列,您可以使用:

pd.DataFrame([x if isinstance(x, list) else [x] for x in a]).rename(columns = lambda x: f"col_{x+1}")

给出:

   col_1  col_2  col_3  col_4  col_5
0    1.0    NaN    NaN    NaN    NaN
1    1.0    2.0    NaN    NaN    NaN
2    1.0    2.0    3.0    NaN    NaN
3    NaN    NaN    NaN    NaN    NaN
4    1.0    2.0    3.0    4.0    NaN
5    NaN    NaN    NaN    NaN    NaN
6    1.0    2.0    3.0    4.0    5.0

这可以是其中一种方式。

import pandas as pd
import numpy as np

a = [
    [1],
    [1, 2],
    [1, 2, 3],
    [],
    [1, 2, 3, 4],
    np.nan,
    [1, 2, 3, 4, 5],
]

num=0
list_dict = {}
for list in a:
    list_dict[num] = pd.Series(list)
    num+=1
df = pd.DataFrame(list_dict).T

print(df)

输出:

+----+-----+-----+-----+-----+-----+
|    |   0 |   1 |   2 |   3 |   4 |
|----+-----+-----+-----+-----+-----|
|  0 |   1 | nan | nan | nan | nan |
|  1 |   1 |   2 | nan | nan | nan |
|  2 |   1 |   2 |   3 | nan | nan |
|  3 | nan | nan | nan | nan | nan |
|  4 |   1 |   2 |   3 |   4 | nan |
|  5 | nan | nan | nan | nan | nan |
|  6 |   1 |   2 |   3 |   4 |   5 |
+----+-----+-----+-----+-----+-----+