【问题标题】:Sum a Pandas DataFrame column under the ranges of another DataFrame在另一个 DataFrame 的范围下对 Pandas DataFrame 列求和
【发布时间】:2018-03-16 03:35:54
【问题描述】:

我有两个 DataFrames DF1DF2,我想在 DF2 中一列的日期范围下聚合 DF1 中一列的值。这是我的可重现示例:

DF1 范围从6/14/20137/13/2013,按时间降序排列。其要聚合的列是ab。注意,同一个date可以有多个记录。

list1 = [{'a': 5, 'date': '7/13/2013', 'b': 13},
 {'a': 4, 'date': '7/12/2013', 'b': 14},
 {'a': 7, 'date': '7/12/2013', 'b': 12},
 {'a': 2, 'date': '7/10/2013', 'b': 18},
 {'a': 9, 'date': '7/7/2013', 'b': 17},
 {'a': 6, 'date': '7/5/2013', 'b': 20},
 {'a': 8, 'date': '6/30/2013', 'b': 12},
 {'a': 5, 'date': '6/29/2013', 'b': 13},
 {'a': 3, 'date': '6/25/2013', 'b': 13},
 {'a': 4, 'date': '6/23/2013', 'b': 10},
 {'a': 1, 'date': '6/22/2013', 'b': 16},
 {'a': 6, 'date': '6/20/2013', 'b': 19},
 {'a': 7, 'date': '6/18/2013', 'b': 12},
 {'a': 9, 'date': '6/16/2013', 'b': 15}]

DF1 = pd.DataFrame(list1)

DF2 包含每周日期分隔符,DF1ab 应聚合。

list2 = [{'datesep': '6/22/2013', 'c': 32},
 {'datesep': '6/29/2013', 'c': 23},
 {'datesep': '7/6/2013', 'c': 44},
 {'datesep': '7/13/2013', 'c': 18},
 {'datesep': '7/20/2013', 'c': 51}]

DF2 = pd.DataFrame(list2)

我想要做的是保持DF1.c 原样,并聚合DF1.aDF1.b,以便在DF2.datesep 分隔符上对这些值求和,就在它们的DF1.date 上方。也就是说,DF1.aDF1.b 的值从6/16/20136/22/2013(包括两者)应该在最近的下一个日期分隔符处聚合,即DF2.datesep=6/22/2013 行。 7/7/20137/13/2013(包括两者)应在最近的下一个日期分隔符处聚合,即 DF2.datesep=7/13/2013 行等。因此结果应如下所示(列顺序无关紧要):

       c       date a_sum  b_sum
0     32  6/22/2013    23     62
1     23  6/29/2013    12     36
2     44   7/6/2013    14     32
3     18  7/13/2013    27     74
4     51  7/20/2013     -      -

我在list1list2 上循环执行此操作,但是是否有使用DF1DF2 的Pandas/Numpy 解决方案?谢谢!

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    首先您需要将日期字符串转换为实际日期。然后,您可以使用 lambda 计算每一行的 a_sum 和 b_sum。最后合并df到DF2:

    DF1.date = pd.to_datetime(DF1.date)
    DF2['end'] = pd.to_datetime(DF2.datesep)
    DF2['start'] = DF2.end.shift(1).fillna(pd.to_datetime('1970-01-01'))
    sums = DF2.apply(lambda x: DF1.loc[DF1.date.gt(x.start) & DF1.date.le(x.end)][['a','b']].sum(), axis=1)
    sums.columns=['a_sum','b_sum']
    pd.concat([DF2[['c','datesep']],sums],1)
    
        c   datesep a_sum   b_sum
    0   32  6/22/2013   23  62
    1   23  6/29/2013   12  36
    2   44  7/6/2013    14  32
    3   18  7/13/2013   27  74
    4   51  7/20/2013   0   0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-06
      • 1970-01-01
      相关资源
      最近更新 更多