【问题标题】:Aligning and adding columns in multiple Pandas dataframes based on Date column基于日期列在多个 Pandas 数据框中对齐和添加列
【发布时间】:2016-01-19 20:56:46
【问题描述】:

我有许多数据框,它们都包含标记为“日期”和“成本”的列以及其他列。我想根据排列“日期”列中的日期,在不同框架的“成本”列中添加数字数据,以提供每个日期的总成本时间序列。

每个数据帧中有不同数量的行。

这似乎是 Pandas 应该非常适合做的事情,但我找不到干净的解决方案。

任何帮助表示赞赏!

这里有两个数据框:

df1:
Date  Total Cost  Funded Costs  
0 2015-09-30      724824        940451   
1 2015-10-31      757605        940451     
2 2015-11-15      788051        940451     
3 2015-11-30      809368        940451    

df2:
Date  Total Cost  Funded Costs  
0 2015-11-30        3022         60000    
1 2016-01-15        3051         60000        

我想让结果数据框有五行(有五个不同的日期)和一列,其中包含每个数据框的“总成本”列的总数。最初我使用以下内容:

totalFunding = df1['Total Cost'].values + df2['Total Cost'].values

在每个数据框中都有不同的日期之前,这一直很好。

谢谢!

下面发布的解决方案效果很好,除了我需要递归地执行此操作,因为我有许多数据框。我创建了以下函数:

def addDataFrames(f_arg, *argv):
    dfTotal = f_arg
    for arg in argv:
        dfTotal = dfTotal.set_index('Date').add(arg.set_index('Date'), fill_value = 0)
return dfTotal

添加前两个数据帧时效果很好。但是,加法方法似乎将我的 Date 列转换为结果总和中的索引,因此随后通过函数失败。以下是前两个数据框相加后 dfTotal 的样子:

            Total Cost  Funded Costs  Remaining Cost  Total Employee Hours
Date                                                                      
2015-09-30     1449648       1880902          431254                7410.6
2015-10-31     1515210       1880902          365692                7874.4
2015-11-15     1576102       1880902          304800                8367.2
2015-11-30     1618736       1880902          262166                8578.0
2015-12-15     1671462       1880902          209440                8945.2
2015-12-31     1721840       1880902          159062                9161.2
2016-01-15     1764894       1880902          116008                9495.0

请注意,数据框中最初称为“日期”的列现在被列为索引,导致 df.set_index('日期') 在随后通过我的函数时生成错误。

【问题讨论】:

  • 发布代表性数据、创建 dfs 的代码、您的尝试以及所需的输出

标签: python pandas


【解决方案1】:

DataFrame.add 完全符合您的要求;它根据索引匹配 DataFrame,所以:

df1.set_index('Date').add(df2.set_index('Date'), fill_value=0)

应该可以解决问题。如果您只想要 Total Cost 列并且想要它作为 DataFrame:

df1.set_index('Date').add(df2.set_index('Date'), fill_value=0)[['Total Cost']]

另请参阅 DataFrame.add 的文档: http://pandas.pydata.org/pandas-docs/version/0.17.1/generated/pandas.DataFrame.add.html

【讨论】:

    【解决方案2】:

    找到解决方案。如前所述, add 方法将“日期”列转换为数据框索引。这已通过以下方式解决:

    dfTotal['Date'] = dfTotal.index
    

    那么完整的函数是:

    def addDataFrames(f_arg, *argv):
    dfTotal = f_arg
    for arg in argv:
        dfTotal = dfTotal.set_index('Date').add(arg.set_index('Date'), fill_value = 0)
        dfTotal['Date'] = dfTotal.index
    return dfTotal
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 2021-04-09
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      相关资源
      最近更新 更多