【问题标题】:Join several dataframes on an empty dataframe with fixed index, merging columns or appending those在具有固定索引的空数据帧上加入多个数据帧,合并列或附加那些
【发布时间】:2019-06-07 09:35:25
【问题描述】:

我有一个带有范围索引但没有数据的数据框,在实际数据中,索引是一个时间范围。

例如

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')

我想要的是您在 Fig7 中看到的输出。

【问题讨论】:

  • 试试 pandas merge 方法

标签: python pandas dataframe join


【解决方案1】:

您可以groupby 索引并与first 聚合:

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

【讨论】:

  • 谢谢!Sandeep 的两种方法和你的工作,但你的性能比 5ms 和 9ms 更好
【解决方案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

【讨论】:

    猜你喜欢
    • 2020-10-31
    • 1970-01-01
    • 2020-06-19
    • 2019-03-07
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    相关资源
    最近更新 更多