我有两个这样的数据帧:
df1 df2
col1 col2 col3 col1 col2
item1 14 NaN item1 3
item1 28 NaN item2 4
item1 6 NaN ...
item1 16 NaN
item1 7 NaN
item1 25 NaN
item1 11 NaN
item1 17 NaN
item1 10 NaN
item1 22 NaN
item2 21 NaN
item2 25 NaN
item2 24 NaN
item2 25 NaN
item2 16 NaN
item2 15 NaN
item2 26 NaN
item2 14 NaN
item2 16 NaN
item2 30 NaN
...
我需要在数据框col3
中填充df1
列col2
,并在数据框{{1}中指定的时间间隔内使用df1
列df2
中的值的总和}}。对于数据框col1
的列df1
中的每个唯一值,它是唯一的,并在col2
的{{1}}列中指出。但与此同时,如果df2
中的col2
列中没有足够的值,则只汇总那些值。我需要为df1
的{{1}}列中的每个唯一值获取此类金额。
结果应如下所示:
col1
以下是如何计算df1
col1 col2 col3
item1 14 48
item1 28 50
item1 6 29
item1 16 48
item1 7 43
item1 25 53
item1 11 38
item1 17 49
item1 10 32
item1 22 22
item2 21 95
item2 25 90
item2 24 80
item2 25 82
item2 16 71
item2 15 71
item2 26 86
item2 14 60
item2 16 46
item2 30 30
...
问题在于item1
的{{1}}列中有很多唯一值,而col1 col2 calculations for col3
item1 14 (14 + 28 + 6) =48
item1 28 (28 + 6 + 16) =50
item1 6 ( 6 + 16 + 7) =29
item1 16 (16 + 7 + 25) =48
item1 7 ( 7 + 25 + 11) =43
item1 25 (25 + 11 + 17) =53
item1 11 (11 + 17 + 10) =38
item1 17 (17 + 10 + 22) =49
item1 10 (10 + 22 ) =32
item1 22 (22 ) =22
中col1
列中指定的时间间隔每次都可能不同。
我将不胜感激任何帮助!
答案 0 :(得分:2)
Rolling
的 apply
df1['window']=df1.col1.map(df2.set_index('col1').col2)
df1['col3']=df1.groupby('col1').apply(lambda x : x.col2.sort_index(ascending=False)\
.rolling(window=x.window.values[0],min_periods=1).sum()).reset_index(level='col1',drop=True)
df1
Out[219]:
col1 col2 col3 window
0 item1 14 48.0 3
1 item1 28 50.0 3
2 item1 6 29.0 3
3 item1 16 48.0 3
4 item1 7 43.0 3
5 item1 25 53.0 3
6 item1 11 38.0 3
7 item1 17 49.0 3
8 item1 10 32.0 3
9 item1 22 22.0 3
10 item2 21 95.0 4
11 item2 25 90.0 4
12 item2 24 80.0 4
13 item2 25 82.0 4
14 item2 16 71.0 4
15 item2 15 71.0 4
16 item2 26 86.0 4
17 item2 14 60.0 4
18 item2 16 46.0 4
19 item2 30 30.0 4
答案 1 :(得分:1)
rolling sum, [::-1]
的另一种类似方法,即
df1['new'] = df1['col1'].map(df2.set_index('col1')['col2'])
df1['col3'] = df1.groupby(['col1'])['col2','new'].apply( lambda x : x[['col2']][::-1].rolling(x.new.values[0],min_periods=1).sum()[::-1]).values
输出:
col1 col2 col3 new 0 item1 14 48.0 3 1 item1 28 50.0 3 2 item1 6 29.0 3 3 item1 16 48.0 3 4 item1 7 43.0 3 5 item1 25 53.0 3 6 item1 11 38.0 3 7 item1 17 49.0 3 8 item1 10 32.0 3 9 item1 22 22.0 3 10 item2 21 95.0 4 11 item2 25 90.0 4 12 item2 24 80.0 4 13 item2 25 82.0 4 14 item2 16 71.0 4 15 item2 15 71.0 4 16 item2 26 86.0 4 17 item2 14 60.0 4 18 item2 16 46.0 4 19 item2 30 30.0 4