根据日期列

时间:2016-01-19 20:56:47

标签: python 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

请注意,数据框中最初名为“Date”的列现在被列为导致df.set_index('Date')的索引,以便在后续遍历我的函数时生成错误。

2 个答案:

答案 0 :(得分:0)

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

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

应该做的伎俩。如果您只想要“总费用”列,并希望将其作为数据框:

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

答案 1 :(得分:0)

找到解决方案。如上所述,add方法将'Date'列转换为dataframe索引。这是通过以下方式解决的:

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