根据条件在熊猫数据框中创建一列

时间:2020-03-04 19:28:36

标签: python-3.x pandas

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

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)创建一个变量“ final”并将其设置为0

2)每个月,如果month1 <= max(month),则将month == month1设置为“ final”,将month1从上个月的“ final” +原始月份的值。例如,

  • 索引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

2 个答案:

答案 0 :(得分:0)

定义以下功能:

  1. 要应用于每行(当前组中)的函数:

    $ ./a.out 
    test2 42
    value1: test2, value2: 42
    $ ./a.out 
    test3 12 34
    value1: test3, value2: 12, value3: 34
    
  2. 要应用于每个组的功能:

    def fn(row, tbl, maxMonth):
        return tbl[tbl.month1 == row.month].value.sum()
    

然后,要计算 final 列,请按 flag df 分组并应用 fnGrp 到每个组,并将结果保存在 final 列中:

def fnGrp(grp):
    return grp.apply(fn, axis=1, tbl=grp, maxMonth=grp.month.max())

结果(添加了列的 df )为:

df['final'] = df.groupby('flag').apply(fnGrp).reset_index(level=0, drop=True)

答案 1 :(得分:-1)

您可以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