【问题标题】:pandas concat/merge/join multiple dataframes with only one column by this columnpandas concat/merge/join 多个数据帧,该列只有一列
【发布时间】:2019-08-07 08:37:58
【问题描述】:

我有(超过)两个数据框:

In [22]: df = pd.DataFrame({'database' : ['db1', 'db2', 'db3']})                                                                                                                                                             

In [23]: df1 = pd.DataFrame({'database' : ['db1', 'db2', 'db3']})                                                                                                                                                            

In [24]: df2 = pd.DataFrame({'database' : ['db2', 'db3', 'db4']})                                                                                                                                                            

In [25]: df1                                                                                                                                                                                                                 
Out[25]: 
  database
0      db1
1      db2
2      db3

In [26]: df2                                                                                                                                                                                                                 
Out[26]: 
  database
0      db2
1      db3
2      db4

我想要输出的是这种格式的数据框:

Out[45]: 
  database database
0      db1         
1      db2      db2
2      db3      db3
3               db4

我设法以这种格式获得它:

df1.index = df1.database.values.ravel()
df2.index = df2.database.values.ravel()
pd.concat([df1, df2], axis=1).fillna('').reset_index(drop=True)                                                                                                                                                              

但我认为必须有比这个带有 ravel() 函数的技巧更好的解决方案。

【问题讨论】:

    标签: python pandas join merge concat


    【解决方案1】:

    DataFrame.set_indexdrop=False 一起使用:

    df = (pd.concat([df1.set_index('database', drop=False), 
                     df2.set_index('database', drop=False)], axis=1)
            .fillna('')
            .reset_index(drop=True))
    print (df)
      database database
    0      db1         
    1      db2      db2
    2      db3      db3
    3               db4
    

    更多动态解决方案list comprehension:

    dfs = [df, df1, df2]
    dfs1 = [x.set_index('database', drop=False) for x in dfs]
    df = (pd.concat(dfs1, axis=1)
            .fillna('')
            .reset_index(drop=True))
    print (df)
      database database database
    0      db1      db1         
    1      db2      db2      db2
    2      db3      db3      db3
    3                        db4
    

    【讨论】:

      【解决方案2】:

      您可以创建一个系列并将其作为一行附加到您的数据框中,然后将第二列移动 1。这是一个示例:

      df = pd.concat([df1, df2], axis = 1)
      import numpy as np
      s = pd.Series([np.NaN, np,NaN], index = ['database', 'database1'])
      df.append(s, ignore_index = True)
      df['database1'] = df['database1'].shift(1)
      df.fillna('')
      

      这将产生预期的输出。希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        • 2016-08-23
        • 2020-12-04
        • 2021-11-01
        相关资源
        最近更新 更多