【问题标题】:how to combine two pandas dataframe with same format but different length index如何组合两个格式相同但长度索引不同的熊猫数据框
【发布时间】:2018-03-12 22:10:35
【问题描述】:

我有多个数据框。每个数据帧都有时间索引,它们都是相同的格式(日期时间)。问题是一些数据帧从 2000 年到 2004 年,而其他数据帧从 2001 年到 2004 年等等。我不知道哪个数据帧的时间最长。例如,

df1
             companyA
2000-01-01   10    
2000-02-01   13
2000-03-01   21
2000-04-01   11
2000-05-01   9
2000-06-01   18
      .
      .
      .
2017-09-01   3
2017-10-01   14
2017-11-01   20
2017-12-01   5

df2
             companyB
2004-01-01   19    
2004-02-01   32
2004-03-01   17
2004-04-01   42
2004-05-01   29
2004-06-01   31
      .
      .
      .
2017-09-01   43
2017-10-01   54
2017-11-01   30
2017-12-01   45

我想把它做成

df1
             companyA    companyB    companyC...
2000-01-01   10          0           0
2000-02-01   13          0           0
2000-03-01   21          0           0
2000-04-01   11          0           0
2000-05-01   9           0           0
2000-06-01   18          0           0
      .
      .
      .
2004-01-01   19          19           0
2004-02-01   12          32           0
2004-03-01   17          17           0
2004-04-01   12          42           0
2004-05-01   19          29           0
2004-06-01   11          31           0
      .
      .
      .
2017-09-01   3           43           15
2017-10-01   14          34           24
2017-11-01   20          50           14
2017-12-01   5           45           21

我试过了

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

但它只是堆叠并忽略了索引。 我也尝试过合并,但也没有用。

编辑:

pd.merge(df1,df2,left_index=True,right_index=True,how='outer').fillna(0)

这正是我想做的,但是,有没有办法合并两个以上的数据框?如果我有 100 家公司,我不想重复 100 次。

【问题讨论】:

  • 请发布不想要的结果。我看不到它如何与axis=1 叠加,水平合并并忽略索引。

标签: python python-2.7 pandas dataframe


【解决方案1】:

这就是你所追求的吗?

pd.concat([df1,df2]).fillna(0)

或:

pd.merge(df1,df2,left_index=True,right_index=True,how='outer').fillna(0)
Out[9]: 
            companyA  companyB
2000-01-01      10.0       0.0
2000-02-01      13.0       0.0
2000-03-01      21.0       0.0
2000-04-01      11.0       0.0
2000-05-01       9.0       0.0
2000-06-01      18.0       0.0
2004-01-01       0.0      19.0
2004-02-01       0.0      32.0
2004-03-01       0.0      17.0
2004-04-01       0.0      42.0
2004-05-01       0.0      29.0
2004-06-01       0.0      31.0
2017-09-01       3.0      43.0
2017-10-01      14.0      54.0
2017-11-01      20.0      30.0
2017-12-01       5.0      45.0

【讨论】:

    【解决方案2】:

    你也可以使用 .join 来达到这个目的

    df1.join(df2, how='outer).join(df3, how='outer')
    

    .join(dataFrame, how='outer')

    将连接数据帧,使得索引是所有使用的数据帧的索引的并集。

    【讨论】:

      【解决方案3】:

      我想合并的许多 DataFrame 都有同样的问题。一个递归函数为我解决了这个问题。

      from random import randint
      import numpy as np
      import pandas as pd
      
      def rand_dataframe(x):
          rnd = randint(2,10)
          return pd.DataFrame(np.random.rand(rnd), index = range(rnd))
      
      
      def rec_merge(data, merged = None):
          if len(data) == 0:
              return merged
          if type(merged) == type(None):
              return rec_merge(data[1:], data[0])
          return rec_merge(data[1:], pd.merge(merged, data[0], left_index=True, right_index=True, how='outer').fillna(0))
      
      
      dummy = map(rand_dataframe, range(randint(2,10)))
      rec_merge(dummy)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-10-02
        • 1970-01-01
        • 2016-05-05
        • 2013-09-29
        • 2021-04-27
        • 1970-01-01
        • 1970-01-01
        • 2018-09-04
        相关资源
        最近更新 更多