我有一个带范围索引的数据框,没有数据,在实际数据中,索引是一个时间范围。
例如
df_main = pd.DataFrame(index = pd.RangeIndex(0,15,1))
见图1
我有几个不同的列和索引的数据框,我只想基于索引将那些连接到主数据框上:
df1 = pd.DataFrame({'value': [1, 2, 3, 5]}, index = pd.RangeIndex(0,4,1))
df2 = pd.DataFrame({'value': [5, 6, 7, 8]}, index = pd.RangeIndex(4,8,1))
df3 = pd.DataFrame({'value2': [9, 8, 7, 6]}, index = pd.RangeIndex(0,4,1))
df4 = pd.DataFrame({'value': [1, 2],'value2': [3, 4],'value3': [5, 6]}, index = pd.RangeIndex(10,12,1))
请参见图2、3、4、5
我尝试了concat:
display(pd.concat([df_main,df1,df2,df3,df4]))
这给了我不必要的输出,如图6所示。
我还尝试了加入,导致出现我不明白的错误:
ValueError: Indexes have overlapping values: Index(['value', 'value2'], dtype='object')
我想要的是您可以在图7中看到的输出。
答案 0 :(得分:2)
使用reduce
和DataFrame.combine_first
:
from functools import reduce
df = reduce((lambda x, y: x.combine_first(y)), [df_main,df1,df2,df3,df4])
print(df)
value value2 value3
0 1.0 9.0 NaN
1 2.0 8.0 NaN
2 3.0 7.0 NaN
3 5.0 6.0 NaN
4 5.0 NaN NaN
5 6.0 NaN NaN
6 7.0 NaN NaN
7 8.0 NaN NaN
8 NaN NaN NaN
9 NaN NaN NaN
10 1.0 3.0 5.0
11 2.0 4.0 6.0
12 NaN NaN NaN
13 NaN NaN NaN
14 NaN NaN NaN
答案 1 :(得分:2)
pd.concat([df_main, df1, df2, df3, df4]).groupby(level=0).first()
[出]
value value2 value3
0 1.0 9.0 NaN
1 2.0 8.0 NaN
2 3.0 7.0 NaN
3 5.0 6.0 NaN
4 5.0 NaN NaN
5 6.0 NaN NaN
6 7.0 NaN NaN
7 8.0 NaN NaN
8 NaN NaN NaN
9 NaN NaN NaN
10 1.0 3.0 5.0
11 2.0 4.0 6.0
12 NaN NaN NaN
13 NaN NaN NaN
14 NaN NaN NaN