细分一个python数据框以在每个段中运行一个函数



我正在尝试运行一个适合我的数据集的函数(几乎(。事实是,当我使用整个数据框架时,我的功能无法正常工作。数据框的标题介绍了以下内容:

           ID   POSITION_X  POSITION_Y  POSITION_T
0           0     116.231     114.277           0
1           0     116.131     114.376           1
2           0     116.189     114.364           2
3           1     116.150     114.398           0
4           1     116.271     114.375           1
5           2     116.157     114.296           0
6           2     116.220     114.384           1
7           2     116.221     114.280           2
8           2     116.277     114.489           3
9           3     116.172     114.237           0

如何分割或拆分数据框以告诉python运行函数读取个人ID集的功能?然后移动到下一个,依此类推

更新:我的功能具有以下参数:

N = df1.groupby('ID').size()          
max_time = N*(0.1)
frames = max_time/N
t_step=frames.item()

data = pd.DataFrame({'N':N,'max_time':max_time,'frames':frames})
print(data)
t=np.linspace(0.1, max_time.item(), N)

和该函数在相应的列['position_x','position_y']中调用一些参数和使用,如下所示:

def myfun(df1, frames, coords=['POSITION_X', 'POSITION_Y']):

        tau = t.copy()
        shifts = np.floor(tau / t_step).astype(np.int)
        msds_sum = np.zeros(shifts.size)
        delta_inv = np.arange(N+1)
        delta = delta_inv[N:0:-1]
        lag = np.arange(1,N+1)

        for i, shift in enumerate(shifts):
            diffs = df1[coords] - df1[coords].shift(-shift)
            sqdist = np.square(diffs).sum(axis=1)
            msds_sum[i] = sqdist.sum()
            msd = np.divide(msds_sum,delta)
            delta_inv = np.arange(N+1)
        msds = pd.DataFrame({'msd':msd, 'delta':delta, 'lag':lag})
        return msds
msd = myfun(df1, frames, coords=['POSITION_X', 'POSITION_Y'])
print(msd)

如果我在单个ID数据集上运行该功能,则可以很好地工作!但是我如何指出每组ID的重复功能?

您可以使用pandas.groupbyapply()在各个组上运行一个函数,为:

代码:

def apply_to_group(group):
    return (group['ID'] * 100) + group['POSITION_T']
df.groupby(['ID']).apply(apply_to_group)

测试代码:

import pandas as pd
df = pd.read_fwf(StringIO(u"""
    ID   POSITION_X  POSITION_Y  POSITION_T
    0     116.231     114.277           0
    0     116.131     114.376           1
    0     116.189     114.364           2
    1     116.150     114.398           0
    1     116.271     114.375           1
    2     116.157     114.296           0
    2     116.220     114.384           1
    2     116.221     114.280           2
    2     116.277     114.489           3
    3     116.172     114.237           0"""),
                 header=1)
def apply_to_group(group):
    return (group['ID'] * 100) + group['POSITION_T']
print(df)
print(df.groupby(['ID']).apply(apply_to_group))

结果:

   ID  POSITION_X  POSITION_Y  POSITION_T
0   0     116.231     114.277           0
1   0     116.131     114.376           1
2   0     116.189     114.364           2
3   1     116.150     114.398           0
4   1     116.271     114.375           1
5   2     116.157     114.296           0
6   2     116.220     114.384           1
7   2     116.221     114.280           2
8   2     116.277     114.489           3
9   3     116.172     114.237           0
ID   
0   0      0
    1      1
    2      2
1   3    100
    4    101
2   5    200
    6    201
    7    202
    8    203
3   9    300
dtype: int64

相关内容

最新更新