我有一个数据框,其中有许多受试者完成了许多试验(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/

10-11 13:43