首页 > 解决方案 > 在 pd.DataFrame 对象中使用带有组的 apply() 函数的 rolling()

问题描述

我正在尝试计算同一组的每一行之间的梯度

def get_gradient(row, row2):
    return (row['foo'] - row2['foo'])/(row['bar'] - row2['bar'])

在下面的示例表中:

运行get_gradient(demo.iloc[0],demo.iloc[1])将获得第一个非np.nan值。然后get_gradient(demo.iloc[1],demo.iloc[2])将获得下一个值。然而,当baz变成 时B,我们转移到一个“新窗口”

demo = pd.DataFrame(
    {
        'foo':[0.023939,0.180167,0.316840,0.497396,0.632713,0.332927,0.489553,0.677083,0.810815,0.967808],
        'bar':[0.027107,0.070630,0.014774,0.059228,0.033585,0.010692,0.012511,0.011934,0.028882,0.365916],
        'baz':['A','A','A','A','A','B','B','B','B','B',]
    }
)
酒吧 巴兹
0 0.023939 0.027107 一个
1 0.180167 0.07063 一个
2 0.31684 0.014774 一个
3 0.497396 0.059228 一个
4 0.632713 0.033585 一个
5 0.332927 0.010692
6 0.489553 0.012511
7 0.677083 0.011934
8 0.810815 0.028882
9 0.967808 0.365916

我希望达到下表:

酒吧 巴兹 毕业
0 0.023939 0.027107 一个
1 0.180167 0.07063 一个 3.58955
2 0.31684 0.014774 一个 -2.44688
3 0.497396 0.059228 一个 4.06164
4 0.632713 0.033585 一个 -5.27696
5 0.332927 0.010692
6 0.489553 0.012511 86.1056
7 0.677083 0.011934 -325.009
8 0.810815 0.028882 7.89072
9 0.967808 0.365916 0.465808

我知道和groupby(),但无法确定正确的链接顺序。链接这些方法以形成预期表的最佳方法是什么?rolling()apply(,axis=1)

标签: python-3.xpandasdataframe

解决方案


这是一个简单的方法:

foo_diff = demo.groupby('baz')['foo'].diff()
bar_diff = demo.groupby('baz')['bar'].diff()
demo['gradient'] = foo_diff/bar_diff

结果:

    foo         bar         baz gradient
0   0.023939    0.027107    A   NaN
1   0.180167    0.070630    A   3.589550
2   0.316840    0.014774    A   -2.446881
3   0.497396    0.059228    A   4.061637
4   0.632713    0.033585    A   -5.276957
5   0.332927    0.010692    B   NaN
6   0.489553    0.012511    B   86.105553
7   0.677083    0.011934    B   -325.008666
8   0.810815    0.028882    B   7.890725
9   0.967808    0.365916    B   0.465808

推荐阅读