我有一个熊猫数据框,如下所示:

import pandas as pd
import numpy as np
import datetime

# intialise data of lists.
data = {'month'      :[2,3,4,5,6,7,2,3,6,5],
        'flag': ["A","A","A","A","A","A","B","B","B","B"],
        'month1'     :[4,4,7,15,11,13,6,5,6,5],
       'value'     :[100,20,50,10,65,86,24,12,1000,200]
       }

# Create DataFrame
df = pd.DataFrame(data)

# Print the output.
df
    month   flag    month1  value
0   2       A       4       100
1   3       A       4       20
2   4       A       7       50
3   5       A       15      10
4   6       A       11      65
5   7       A       13      86
6   2       B       6       24
7   3       B       5       12
8   6       B       6       1000
9   5       B       5       200


现在,对于每个月中唯一的标志,我想执行以下逻辑

1)创建一个变量“最终”并将其设置为0

2)对于每个月,如果month1

索引0到5是一组(标志='A')
A组的月份列的最大值为7
对于第1行(第2个月),month1是小于7的4,请转到第4个月(第3行),将“最终”列的值更新为100(0(当前“最终”值)+100(原始值月)
对组中的每一行执行上述步骤。


预期产量:

    month   flag    month1  value   Final
0   2       A       4       100     0
1   3       A       4       20      0
2   4       A       7       50      120
3   5       A       15      10      0
4   6       A       11      65      0
5   7       A       13      86      50
6   2       B       6       24      0
7   3       B       5       12      0
8   6       B       6       1000    1024
9   5       B       5       200     212

最佳答案

您可以groupby'flag'和'month1'并获取'value'的sum,然后将mergedf加上fillna与0,例如:

new_df = df.merge(df.groupby(['flag', 'month1'])[['value']].sum(),
                  left_on=['flag','month'], right_index=True,
                  how='left', suffixes=('','_final'))\
           .fillna({'value_final':0})
print (new_df)
   month flag  month1  value  value_final
0      2    A       4    100          0.0
1      3    A       4     20          0.0
2      4    A       7     50        120.0
3      5    A      15     10          0.0
4      6    A      11     65          0.0
5      7    A      13     86         50.0
6      2    B       6     24          0.0
7      3    B       5     12          0.0
8      6    B       6   1000       1024.0
9      5    B       5    200        212.0

10-04 21:43