使用pandas

时间:2017-10-13 14:19:43

标签: python pandas

我有两个这样的数据帧:

         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中填充df1col2,并在数据框{{1}中指定的时间间隔内使用df1df2中的值的总和}}。对于数据框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列中指定的时间间隔每次都可能不同。

我将不胜感激任何帮助!

2 个答案:

答案 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