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

问题描述 投票:0回答:1

我有一个包含四列的数据框。第一列代表主题,每个主题在一列中连续重复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)

不执行任何操作!

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

python pandas position
1个回答
0
投票

IIUC使用:

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

或:

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)
© www.soinside.com 2019 - 2024. All rights reserved.