根据另一列的值交换第一列中的值



我有一个包含四列的数据帧。第一列表示主题,每个主题在一列中连续重复60次。总共有54名受试者。第二列表示块。每个受试者经历了6个区块,从第1区块开始,到第6区块结束。第三列是名称。每个区块包含10个名称,这些名称是从20个可能的名称中随机选择的。第四列表示"名称"的序列号。因此,每个块包含1-10的序列号和相应的随机分配的名称。问题是,名称的序列号分配错误。

我想要的是根据相应的序列号交换(更改位置(名称。因此Name under Serial Number 1将是swapped with Name with the Serial Number 6(pattern: 1=6, 2=7, 3=8, 4=9, 5=10)。序列号保持不变,但名称的顺序需要更改。我想为每个学科的每个区块做这个。我有一个代码正在做正确的事情,但问题是,它只适用于第一个主题:

df['Name'] = (df.assign(blk_5 = (np.arange(len(df))//5+1) % 2,
blk_10 = np.arange(len(df)) // 10
)
.sort_values(['Block','blk_10','blk_5'])
['Name'].values
)

我尝试使用groupby对Subject列进行分组,并为每个Subject分配函数,但没有成功。

def function_test(df):  
df['Name'] = (df.assign(blk_5 = (np.arange(len(df))//5+1) % 2,
blk_10 = np.arange(len(df)) // 10
)
.sort_values(['Block','blk_10','blk_5'])
['Name'].values
)
......
grouped = df.groupby('Subject')
print(grouped.transform(function_test))
...
Retrurns: AttributeError: 'Series' object has no attribute 'assign'

我试过的另一件事:

test = df.groupby(['Subject', 'Block']).apply(function_test)

什么都没有!

有什么建议吗?非常感谢!

IIUC使用:

def function_test(x):  
x['Name'] = (x.assign(blk_5 = (np.arange(len(x))//5+1) % 2,
blk_10 = np.arange(len(x)) // 10
)
.sort_values(['Block','blk_10','blk_5'])
['Name'].values
)
return x
df = df.groupby('Subject').apply(function_test)

最新更新