使用应用于 groupby 的函数的结果来计算原始 df

我有一些如下所示的数据df。我试图首先使用函数计算每个组的平均角度mean_angle。然后使用计算出的平均角度使用函数对每组进行另一次计算fun。


import pandas as pd

import numpy as np

生成样本数据


a = np.array([1,2,3,4]).repeat(4)

x1 = 90 + np.random.randint(-15, 15, size=a.size//2 - 2 )

x2 = 270 + np.random.randint(-50, 50, size=a.size//2 + 2 )


b = np.concatenate((x1, x2))

np.random.shuffle(b) 


df = pd.DataFrame({'a':a, 'b':b})

返回的数据框打印在下面。


    a   b

0   1   295

1   1   78

2   1   280

3   1   94

4   2   308

5   2   227

6   2   96

7   2   299

8   3   248

9   3   288

10  3   81

11  3   78

12  4   103

13  4   265

14  4   309

15  4   229

我的功能是mean_angle和fun


def mean_angle(deg):


    deg = np.deg2rad(deg)


    deg = deg[~np.isnan(deg)]


    S = np.sum(np.sin(deg))

    C = np.sum(np.cos(deg))

    mu = np.arctan2(S,C)

    mu = np.rad2deg(mu)


    if mu <0:

        mu = 360 + mu


    return mu


def fun(x, mu):


    return  np.where(abs(mu - x) < 45, x, np.where(x+180<360, x+180, x-180))

我试过的


mu = df.groupby(['a'])['b'].apply(mean_angle)


df2 = df.groupby(['a'])['b'].apply(fun, args = (mu,)) #this function should be element wise

我知道这是完全错误的,但我想不出更好的方法。


所需的输出是这样的,其中mu每组的 mean_angle


 a   b   c

0   1   295 np.where(abs(mu - 295) < 45, 295, np.where(295 +180<360, 295 +180, 295 -180))

1   1   78 np.where(abs(mu - 78) < 45, 78, np.where(78 +180<360, 78 +180, 78 -180))

2   1   280 np.where(abs(mu - 280  < 45, 280, np.where(280  +180<360, 280  +180, 280  -180))

3   1   94                ...

4   2   308               ...

5   2   227                .

6   2   96                 .

7   2   299                .

8   3   248                .

9   3   288                .

10  3   81                 .

11  3   78                 .

12  4   103                .

13  4   265                .

14  4   309                .

15  4   229                .

任何帮助表示赞赏


叮当猫咪
浏览 146回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python