【问题标题】:Create pandas dataframe from list of lists with unequal lengths and NaN values从具有不等长度和 NaN 值的列表列表创建熊猫数据框
【发布时间】:2021-09-19 11:54:39
【问题描述】:

鉴于以下情况:

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}")

但感觉不是很地道。

【问题讨论】:

    标签: python pandas reshape


    【解决方案1】:

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

    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
    
    

    【讨论】:

    • if isinstance(x, list) 在这里可能更典型
    • 也不需要转置
    • 它是基于作者想要的,但是是的,它并不是真正的功能。编辑,我明白了,我只是瞎了眼,是的,不需要转置:),谢谢@baxx
    • 不,不是——这里的转置与帖子中的示例不匹配
    • 非常感谢@baxx,让帖子更美观、更易读 :)
    【解决方案2】:

    试试这个:

    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 |
    

    【讨论】:

      【解决方案3】:

      这可能是其中一种方式。

      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 |
      +----+-----+-----+-----+-----+-----+
      

      【讨论】:

      • 我认为接受的答案更有意义,没有涵盖的是列表是否是表示列表的字符串(例如 "[1,2]" 而不是 [1,2]
      • @bax 没错,发布的答案更相关。
      猜你喜欢
      • 2018-03-07
      • 2019-09-29
      • 1970-01-01
      • 1970-01-01
      • 2023-01-14
      • 1970-01-01
      • 2018-12-18
      • 2021-06-08
      • 2017-08-27
      相关资源
      最近更新 更多