串联多个数据框并在DataFrame中对行进行排序

时间:2018-08-03 09:42:33

标签: python pandas

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

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 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

这应该有效。

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