嗨,我正在尝试并且无法在python中复制一个相当简单的excel公式。这是我的数据框和我要执行的F列中的计算的屏幕截图:
基本上,对于每个“活动”代码,我想用cumprod值除以1997年的值,然后将其结果放入数据框中的新列中。
在excel中,我可以通过使用$符号锁定单元格来完成此操作,但是鉴于我的数据帧长为数千行,并且有许多activum和其他组变量的组合,因此我希望在python中对此进行编码。
答案 0 :(得分:0)
由div
与set_index
创建并由map
过滤的新Series
使用boolean indexing
:
df = pd.DataFrame({
'statisticsjaar': [1995, 1996, 1997] * 2,
'activum_statline':['A02'] * 3 + ['A04'] * 3,
'cumprod':[7,8,9,4,2,3],
})
s = df[df['statisticsjaar'] == 1997].set_index('activum_statline')['cumprod']
print (s)
activum_statline
A02 9
A04 3
Name: cumprod, dtype: int64
df['new'] = df['cumprod'].div(df['activum_statline'].map(s))
print (df)
statisticsjaar activum_statline cumprod new
0 1995 A02 7 0.777778
1 1996 A02 8 0.888889
2 1997 A02 9 1.000000
3 1995 A04 4 1.333333
4 1996 A04 2 0.666667
5 1997 A04 3 1.000000
如果需要多列join
:
df = pd.DataFrame({
'statisticsjaar': [1995, 1996, 1997] * 2,
'activum_statline':['A02'] * 3 + ['A04'] * 3,
'cumprod':[7,8,9,4,2,3],
'statlinebasiscode':['320700'] * 6,
'niveau':['A38'] * 6,
})
cols = ['activum_statline','statlinebasiscode','niveau']
s = df[df['statisticsjaar'] == 1997].set_index(cols)['cumprod'].rename('new')
print (s)
activum_statline statlinebasiscode niveau
A02 320700 A38 9
A04 320700 A38 3
Name: new, dtype: int64
df['new'] = df['cumprod'].div(df.join(s, on=cols)['new'])
print (df)
statisticsjaar activum_statline cumprod statlinebasiscode niveau new
0 1995 A02 7 320700 A38 0.777778
1 1996 A02 8 320700 A38 0.888889
2 1997 A02 9 320700 A38 1.000000
3 1995 A04 4 320700 A38 1.333333
4 1996 A04 2 320700 A38 0.666667
5 1997 A04 3 320700 A38 1.000000