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

连接多个数据帧并对数据帧中的行排序

  •  1
  • TheTechGuy  · 技术社区  · 6 年前

    我需要合并多个数据帧。下面是数据帧的示例代码

    df1 = pd.DataFrame(np.array([
        [0, 5, 9],
        [0.3434, 4, 61],
        [10.22, 24, 9]]),
        columns=['time', 'attr11', 'attr12'])
    df2 = pd.DataFrame(np.array([
        [0, 5, 19],
        [0.3, 14, 16],
        [9.99, 4, 9]]),
        columns=['time', 'attr21', 'attr22'])
    df3 = pd.DataFrame(np.array([
        [0, 15, 49],
        [6.66, 4, 36],
        [9.66, 14, 9]]),
        columns=['time', 'attr31', 'attr32'])
    

    现在,如果我这样做,连接

    con = pd.concat([df1,df2,df3], ignore_index=True, sort=True)
    sorted_data = con.sort_values(by="time")
    

    我得到了我想要的(几乎)输出,但是有一个额外的三行 0 .

    这是我得到的输出

    attr11  attr12  attr21  attr22  attr31  attr32  time
    0   5.0 9.0 NaN NaN NaN NaN 0.0000
    3   NaN NaN 5.0 19.0    NaN NaN 0.0000
    6   NaN NaN NaN NaN 15.0    49.0    0.0000
    4   NaN NaN 14.0    16.0    NaN NaN 0.3000
    1   4.0 61.0    NaN NaN NaN NaN 0.3434
    7   NaN NaN NaN NaN 4.0 36.0    6.6600
    8   NaN NaN NaN NaN 14.0    9.0 9.6600
    5   NaN NaN 4.0 9.0 NaN NaN 9.9900
    2   24.0    9.0 NaN NaN NaN NaN 10.2200
    

    零时间行应该有一行,而不是三行,因此没有 NaN 在零时间行中。

    第一排应该是这样的

    0  5.0  9.0 5.0 19.0 15.0 49
    

    我该怎么做?

    2 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    您需要创建索引 time 先列后列 concat 按列 axis=1 ,索引默认排序:

    con = pd.concat([df1.set_index('time'),
                     df2.set_index('time'),
                     df3.set_index('time')], axis=1).reset_index()
    

    或者如果使用列表 DataFrames :

    dfs = [x.set_index('time') for x in [df1, df2, df3]]
    con = pd.concat(dfs, axis=1).reset_index()
    

    print (con)
          time  attr11  attr12  attr21  attr22  attr31  attr32
    0   0.0000     5.0     9.0     5.0    19.0    15.0    49.0
    1   0.3434     4.0    61.0     NaN     NaN     NaN     NaN
    2   6.3300     NaN     NaN    14.0    16.0     NaN     NaN
    3   6.6600     NaN     NaN     NaN     NaN     4.0    36.0
    4   9.6600     NaN     NaN     NaN     NaN    14.0     9.0
    5   9.9900     NaN     NaN     4.0     9.0     NaN     NaN
    6  10.2200    24.0     9.0     NaN     NaN     NaN     NaN
    
        2
  •  0
  •   Sha Li    6 年前

    这应该有效。

    aggregation_functions = {'attr11':'sum','attr12':'sum','attr21':'sum','attr22':'sum','attr31':'sum','attr32':'sum'}
    con_new = con.groupby(con['time']).aggregate(aggregation_functions)
    con_new