代码之家  ›  专栏  ›  技术社区  ›  Nk03

熊猫:水平展开数据帧

  •  2
  • Nk03  · 技术社区  · 5 年前

    这可能是重复的,但我找不到所需的答案。

    假设,我有这样一个数据帧:

    d1 = {'col1':  [[1],[2,3]],
          'col2' : [[3],[21,1]]}
    
    df1 = pd.DataFrame(d1)
    
    列1
    0 [3]
    1 [21, 1]

    现在,我们可以通过 df1.apply(pd.Series.explode) . 但是,在水平方向上展开并更改列名的最优雅的方法是什么?

    d2 = {
        'col1_1':[1,2],
        'col1_2': [np.NAN,3],
        'col2_1' : [3,21],
        'col2_2' : [np.NAN,1]
    }
    df2 = pd.DataFrame(d2)
    

    列1\u 1 列2\u 1 第2列
    0 1
    3 21
    2 回复  |  直到 5 年前
        1
  •  3
  •   Andrej Kesely    5 年前
    x = pd.concat(
        [df1[c].apply(pd.Series).add_prefix(c + "_") for c in df1], axis=1
    )
    print(x)
    

    印刷品:

       col1_0  col1_1  col2_0  col2_1
    0     1.0     NaN     3.0     NaN
    1     2.0     3.0    21.0     1.0
    

    如果需要基于1的索引列:

    x = pd.concat(
        [df1[c].apply(pd.Series).add_prefix(c + "_") for c in df1], axis=1
    ).rename(
        columns=lambda x: "{}_{}".format(x.split("_")[0], int(x.split("_")[1]) + 1)
    )
    print(x)
    

    印刷品:

       col1_1  col1_2  col2_1  col2_2
    0     1.0     NaN     3.0     NaN
    1     2.0     3.0    21.0     1.0
    
        2
  •  0
  •   Muhammed Jaseem    5 年前

    试试这个。

    d1 = {'col1':  [[1],[2,3]],
          'col2' : [[3],[21,1]]}
    
    df1 = pd.DataFrame(d1)
    
    col_names = []
    for col in list(df1):
        for col_number in range(max(df1[col].apply(len))):
            col_names.append(col + "_" + str(col_number + 1))
    
    df2 = pd.concat([pd.DataFrame(df1.col1.tolist(), index= df1.index), pd.DataFrame(df1.col2.tolist(), index = df1.index)], axis = 1)
    df2.columns = col_names