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就行不通了?你应该解释为什么。问题是一样的,我不希望有人做我的工作,我只是想知道一些想法,我试图提供更多的信息。如果我给你留下这样的印象,请道歉