【问题标题】:Merging Panda Dataframes - perserve orginial order and overwrite columns合并 Pandas 数据框 - 保留原始顺序并覆盖列
【发布时间】:2020-07-22 15:36:20
【问题描述】:
df1 = pd.DataFrame([(1,5),(2,10),(3,15)],columns=["2009","2008"],index=["C","A","B"])

   2009  2008
C     1     5
A     2    10
B     3    15

df2 = pd.DataFrame([(5,7),(11,14),(14,15)],columns=["2008","2007"],index=["D","B","C"])

   2008  2007
D     5     7
B    11    14
C    14    15

desired_output =
   2009  2008  2007
C     1     5   15
A     2    10   na
B     3    15   14
D    na     5    7

我知道组合两个数据帧有四种主要方法:join、merge、append、concat,我已经尝试了多种方法,但似乎无法成功。

df1.merge(df2,how="outer",left_index=True,right_index=True,on="2008")
   2009  2008  2007
A   2.0    10   NaN
B   3.0    15  14.0
C   1.0     5  15.0
D   NaN     5   7.0

是我能找到的最接近的 - 但列被重新使用。我希望所有相交索引以 df1 的原始顺序排在第一位,然后附加任何非相交索引(理想情况下也按 df2 的顺序)

任何帮助将不胜感激?

【问题讨论】:

  • 你能解释一下如何你想要的输出是从源头得到的原因吗?

标签: python pandas


【解决方案1】:

您可以尝试使用pd.Index.differenceDataFrame.append 来保持索引和列的顺序。

idx = df2.index.difference(df1.index)
df1.append(df2.loc[idx]).fillna(df2)

   2009  2008  2007
C   1.0     5  15.0
A   2.0    10   NaN
B   3.0    15  14.0
D   NaN     5   7.0

【讨论】:

    【解决方案2】:

    尝试combine_firstreindexunion 列索引与sort=False

    df1.combine_first(df2).reindex(df1.columns.union(df2.columns, sort=False), axis=1)
    

    输出:

        2009  2008  2007
    A   2.0  10.0   NaN
    B   3.0  15.0  14.0
    C   1.0   5.0  15.0
    D   NaN   5.0   7.0
    

    【讨论】:

    • idx = df2.index.difference(df1.index); df1.append(df2.loc[idx]).fillna(df2) 维护索引顺序和列顺序,但这看起来很粗略。你怎么看?
    • @Ch3steR... 我认为您应该将其发布为维护列标题和索引顺序的解决方案。
    • 好的,贴出来了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2013-07-26
    相关资源
    最近更新 更多