我有一个数据框,其中有许多受试者完成了许多试验(1:800),并且我想添加一个“阻止”列...每个块有80个试验。我觉得rolling_apply可能是解决方案,但我似乎无法使其正常工作。
我可以做某种事情,就是将两个增量之间的“ trial”的每个值都设置在某个块上,但是好像rolling_apply应该这样做。我真的很想这样做,但这是不可能的:
grouped = df.groupby('sid')
df['block'] = pd.rolling_cumcount(grouped, 80)
有10个街区和800个试验...
blocks = range(10)
increments = range(800)[0::80]
我有这个:
SID Trial
1 0
1 1
1 2
1 3
1 4
1 5
2 0
2 1
2 2
2 3
2 4
2 5
我要结束的是(只有10个区块,每个区块有80个试验):
SID Trial Block
1 0 0
1 1 0
1 2 0
1 3 1
1 4 1
1 5 1
2 0 0
2 1 0
2 2 0
2 3 1
2 4 1
2 5 1
谢谢
我最终只是这样做,这可能不是最佳解决方案,但效果很好:
# add a block to each subject
block = np.arange(1,11)
block_array = np.repeat(block, 80)
blocks_all = np.tile(block_array, df['sid'].nunique())
df['block'] = blocks_all
最佳答案
我会使用groupby的cumcount:
In [11]: g = df.groupby(['SID', 'Trial'])
In [12]: g.cumcount()
Out[12]:
0 0
1 0
2 0
3 1
4 1
5 1
6 0
7 0
8 0
9 1
10 1
11 1
dtype: int64
并将其设置为列:
In [13]: df['Block'] = df.groupby(['SID', 'Trial']).cumcount()
关于python - 我要rolling_apply吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22418363/