Pandas数据框将整个列乘以另一列中的单个单元格,以控制组标识符

时间:2018-10-17 10:43:58

标签: python pandas dataframe

嗨,我正在尝试并且无法在python中复制一个相当简单的excel公式。这是我的数据框和我要执行的F列中的计算的屏幕截图:

datafram

基本上,对于每个“活动”代码,我想用cumprod值除以1997年的值,然后将其结果放入数据框中的新列中。

在excel中,我可以通过使用$符号锁定单元格来完成此操作,但是鉴于我的数据帧长为数千行,并且有许多activum和其他组变量的组合,因此我希望在python中对此进行编码。

1 个答案:

答案 0 :(得分:0)

divset_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