【问题标题】:How to combine data frames of different sizes and overlapping indexes vertically and horizontally in pandas?如何在pandas中垂直和水平组合不同大小和重叠索引的数据框?
【发布时间】:2019-09-13 04:22:11
【问题描述】:

假设我有如下三个数据框:

df1 = pd.DataFrame({'2016-01': ['A0', 'A1', 'A2', 'A3'],
'2016-02': ['B0', 'B1', 'B2', 'B3'],
'2016-03': ['C0', 'C1', 'C2', 'C3'],
'2016-04': ['D0', 'D1', 'D2', 'D3']},
index=['N1', 'N2', 'N3', 'N4'])

df2 = pd.DataFrame({'2017-01': ['A4', 'A5', 'A6'],
'2017-02': ['B4', 'B5', 'B6'],
'2017-03': ['C4', 'C5', 'C6'],
'2017-04': ['D4', 'D5', 'D6']},
index=['N1', 'N3', 'N5'])

df3 = pd.DataFrame({'2018-01': ['A7', 'A8', 'A9'],
'2018-02': ['B7', 'B8', 'B9'],
'2018-03': ['C7', 'C8', 'C9'],
'2018-04': ['D7', 'D8', 'D9']},
index=['N1', 'N5', 'N6'])

>>> df1
   2016-01 2016-02 2016-03 2016-04
N1      A0      B0      C0      D0
N2      A1      B1      C1      D1
N3      A2      B2      C2      D2
N4      A3      B3      C3      D3
>>> df2
   2017-01 2017-02 2017-03 2017-04
N1      A4      B4      C4      D4
N3      A5      B5      C5      D5
N5      A6      B6      C6      D6
>>> df3
   2018-01 2018-02 2018-03 2018-04
N1      A7      B7      C7      D7
N5      A8      B8      C8      D8
N6      A9      B9      C9      D9

如您所见,df1df2df3 具有重叠(但不完全相等的一组)索引。如何将这些 df 合并为一个 final_df,如下所示:

df4 = pd.DataFrame({
'2016-01': ['A0', 'A1', 'A2', 'A3', '', ''],
'2016-02': ['B0', 'B1', 'B2', 'B3', '', ''],
'2016-03': ['C0', 'C1', 'C2', 'C3', '', ''],
'2016-04': ['D0', 'D1', 'D2', 'D3', '', ''],
'2017-01': ['A4', '',  'A5', '', 'A6', ''],
'2017-02': ['B4', '', 'B5', '', 'B6', ''],
'2017-03': ['C4', '', 'C5', '', 'C6', ''],
'2017-04': ['D4', '', 'D5', '', 'D6', ''],
'2018-01': ['A7', '', '', '', 'A8', 'A9'],
'2018-02': ['B7', '', '', '', 'B8', 'B9'],
'2018-03': ['C7', '', '', '', 'C8', 'C9'],
'2018-04': ['D7', '', '', '', 'D8', 'D9']},
index=['N1', 'N2', 'N3', 'N4', 'N5', 'N6'])

>>> df4
   2016-01 2016-02 2016-03 2016-04 2017-01 2017-02 2017-03 2017-04 2018-01 2018-02 2018-03 2018-04
N1      A0      B0      C0      D0      A4      B4      C4      D4      A7      B7      C7      D7
N2      A1      B1      C1      D1
N3      A2      B2      C2      D2      A5      B5      C5      D5
N4      A3      B3      C3      D3
N5                                      A6      B6      C6      D6      A8      B8      C8      D8
N6                                                                      A9      B9      C9      D9

我尝试过这样的事情:

final_df = pd.DataFrame()
for cur_df in [df1, df2, df3]:
    # To handle the indexes that aren't overlapping between final_df and cur_df
    if not(set(cur_df.index).issubset(set(final_df.index))):
        final_df = pd.concat([final_df, cur_df[~cur_df.index.isin(final_df.index)]]) # this is working, but only 

但这只是处理非重叠索引,final_df 的输出是这样的:

>>> final_df
   2016-01 2016-02 2016-03 2016-04 2017-01 2017-02 2017-03 2017-04 2018-01 2018-02 2018-03 2018-04
N1      A0      B0      C0      D0     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
N2      A1      B1      C1      D1     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
N3      A2      B2      C2      D2     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
N4      A3      B3      C3      D3     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN
N5     NaN     NaN     NaN     NaN      A6      B6      C6      D6     NaN     NaN     NaN     NaN
N6     NaN     NaN     NaN     NaN     NaN     NaN     NaN     NaN      A9      B9      C9      D9

我假设在pandas 中必须有一种更简单的方法可以做到这一点,如果有人可以分享见解/建议,我将不胜感激。谢谢!

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    你可以使用

    pd.concat([df1,df2,df3],axis=1,sort=True)
    

    【讨论】:

    猜你喜欢
    • 2022-08-23
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-08
    • 2013-01-11
    • 2012-01-08
    相关资源
    最近更新 更多