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