对另一个DataFram范围下的DataFrame列求和

2024-05-03 14:59:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧DF1DF2,我想将DF1中一列的值聚合到DF2中一列的日期范围下。以下是我的可复制示例:

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上方。也就是说,从6/16/20136/22/2013(两者都包括在内)的DF1.aDF1.b的值应该聚合在最近的下一个日期分隔符处,即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解决方案呢?谢谢您!你知道吗


Tags: 数据示例dataframedate记录时间pddf1
1条回答
网友
1楼 · 发布于 2024-05-03 14:59:18

首先需要将日期字符串转换为实际日期。然后可以使用lambda来计算每行的\u和b\u和。最后将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

相关问题 更多 >