我有一个熊猫数据框,如下所示:
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” +原始月份的值。例如,
预期输出:
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
答案 0 :(得分:0)
定义以下功能:
要应用于每行(当前组中)的函数:
$ ./a.out
test2 42
value1: test2, value2: 42
$ ./a.out
test3 12 34
value1: test3, value2: 12, value3: 34
要应用于每个组的功能:
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
,然后merge
与df
加上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