在函数中包含 groupby 语句 - Python

以下函数计算圆的不同线段内的点数。导出单个时间点的计数时,此功能按预期工作。但是,当尝试使用 groupby 调用在不同时间点导出此计数时,它仍会将所有计数合并到单个输出中。


import pandas as pd

import numpy as np


df = pd.DataFrame({   

        'Time' : ['19:50:10.1','19:50:10.1','19:50:10.1','19:50:10.1','19:50:10.2','19:50:10.2','19:50:10.2','19:50:10.2'],             

        'id' : ['A','B','C','D','A','B','C','D'],                 

        'x' : [1,8,0,-5,1,-1,-6,0],

        'y' : [-5,2,-5,2,5,-5,-2,2],

        'X2' : [0,0,0,0,0,0,0,0],

        'Y2' : [0,0,0,0,0,0,0,0],   

        'Angle' : [0,0,0,0,0,0,0,0],                 

    })


def checkPoint(x, y, rotation_angle, refX, refY, radius = 10):


    section_angle_start = [(i + rotation_angle - 45) for i in [0, 90, 180, 270, 360]]


    Angle = np.arctan2(x-refX, y-refY) * 180 / np.pi

    Angle = Angle % 360


    # adjust range

    if Angle > section_angle_start[-1]:

        Angle -= 360

    elif Angle < section_angle_start[0]:

        Angle += 360


    for i in range(4):

        if section_angle_start[i] < Angle < section_angle_start[i+1]:

            break

    else:

         i = 0


    return i+1  


tmp = []

result = []

以下是我尝试将函数传递给 中的每个唯一组。checkPointTime


for group in df.groupby('Time'):


    for i, row in df.iterrows():

    

        seg = checkPoint(row.x, row.y, row.Angle, row.X2, row.Y2)


        tmp.append(seg)

    

    result.append([tmp.count(i) for i in [1,2,3,4]])


df = pd.DataFrame(result, columns = ['1','2','3','4'])

外:


   1  2  3  4

0  2  1  3  2

1  4  2  6  4

预期输出:


   1  2  3  4

0  0  1  2  1

1  2  0  1  1


哆啦的时光机
浏览 118回答 1
1回答

胡说叔叔

您的内部循环贯穿整个 DataFrame,并生成您正在观察的重复计数。按照@Kenan建议,您可以将内部循环限制为组:for group in df.groupby('Time'):&nbsp; &nbsp; for i, row in group[1].iterrows():&nbsp; &nbsp; &nbsp; &nbsp; seg = checkPoint(row.x_live, row.y_live, row.Angle, row.BallX, row.BallY)&nbsp; &nbsp; &nbsp; &nbsp; tmp.append(seg)&nbsp; &nbsp; result.append([tmp.count(i) for i in [1,2,3,4]])df_result = pd.DataFrame(result, columns = ['1','2','3','4'])print(df_result)导致&nbsp; &nbsp;1&nbsp; 2&nbsp; 3&nbsp; 40&nbsp; 0&nbsp; 1&nbsp; 2&nbsp; 11&nbsp; 2&nbsp; 1&nbsp; 3&nbsp; 2或者,您可以使用 groupby-apply 构造来避免显式循环:def result(g):&nbsp; &nbsp; tmp = []&nbsp; &nbsp; for i, row in g.iterrows():&nbsp; &nbsp; &nbsp; &nbsp; seg = checkPoint(row.x_live, row.y_live, row.Angle, row.BallX, row.BallY)&nbsp; &nbsp; &nbsp; &nbsp; tmp.append(seg)&nbsp; &nbsp; return pd.Series([tmp.count(i) for i in [1,2,3,4]], index=[1,2,3,4])print(df.groupby('Time').apply(result))这让你:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 1&nbsp; 2&nbsp; 3&nbsp; 4Time&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;19:50:10.1&nbsp; 0&nbsp; 1&nbsp; 2&nbsp; 119:50:10.2&nbsp; 2&nbsp; 0&nbsp; 1&nbsp; 1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python