我需要合并多个数据框。这是数据帧的示例代码
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
我该怎么做?
答案 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