Function 分段python数据帧以在每个分段中运行函数

Function 分段python数据帧以在每个分段中运行函数,function,dataframe,multi-index,Function,Dataframe,Multi Index,我正在尝试运行一个适用于我的数据集的函数(几乎)。事实上,当我使用整个数据帧时,我的函数就不起作用了。 数据框的标题如下所示: 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.3

我正在尝试运行一个适用于我的数据集的函数(几乎)。事实上,当我使用整个数据帧时,我的函数就不起作用了。 数据框的标题如下所示:

           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集的python?然后转到下一个,依此类推

更新:我的函数具有以下参数:

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.groupby
apply()
在不同的组上运行函数,如下所示:

代码:

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
测试代码:

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
结果:

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

我很感激你的回答,但是“groupby”和“apply”不起作用,因为之前我必须设置一些依赖于我的数据集的参数。@JonathanPacheco,所以你刚才做的是回答了一个我实际上已经花时间回答的问题,把这个问题编辑成一个与你之前的一个问题几乎相同的问题,这个问题基本上是可以回答的。你为什么这么做?@JonathanPacheco,那么groupby和apply就行不通了?你应该解释为什么。问题是一样的,我不希望有人做我的工作,我只是想知道一些想法,我试图提供更多的信息。如果我给你留下这样的印象,请道歉