当前位置: 首页 > 知识库问答 >
问题:

如何在数据帧中移动列

叶淇
2023-03-14

我想将一列索引为“length”,并使其成为我的第二列。它目前作为第5列存在。我试过:

colnames = big_df.columns.tolist()

# make index "length" the second column in the big_df
colnames = colnames[0] + colnames[4] + colnames[:-1] 

big_df = big_df[colnames]

我看到以下错误:

TypeError:必须是str,而不是list

我不确定如何解释这个错误,因为它实际上应该是一个列表,对吗?

此外,是否有一种通用方法可以按标签将任何列移动到指定位置?我的列只有一个级别,即不涉及多索引。


共有1个答案

闾丘谦
2023-03-14

我不确定如何解释这个错误,因为它实际上应该是一个列表,对吗?

否:colname[0]colname[4]是标量,而不是列表。您不能将标量与列表连接起来。要列出它们,请使用方括号:

colnames = [colnames[0]] + [colnames[4]] + colnames[:-1]

您可以使用df[[colnames]]df.reindex(columns=colnames):两者都必须触发复制操作,因为无法就地处理此转换。

但是,将数组转换为列表,然后手动连接列表不仅成本高昂,而且容易出错。一个相关的答案有许多基于列表的解决方案,但是基于NumPy的解决方案是值得的,因为pd.Index对象存储为NumPy数组。

这里的关键是通过切片而不是串联来修改NumPy数组。只有两种情况需要处理:当前位置之后存在所需位置,反之亦然。

import pandas as pd, numpy as np
from string import ascii_uppercase

df = pd.DataFrame(columns=list(ascii_uppercase))

def shifter(df, col_to_shift, pos_to_move):
    arr = df.columns.values
    idx = df.columns.get_loc(col_to_shift)
    if idx == pos_to_move:
        pass
    elif idx > pos_to_move:
        arr[pos_to_move+1: idx+1] = arr[pos_to_move: idx]
    else:
        arr[idx: pos_to_move] = arr[idx+1: pos_to_move+1]
    arr[pos_to_move] = col_to_shift
    df = df.reindex(columns=arr)
    return df
    
df = df.pipe(shifter, 'J', 1)

print(df.columns)

Index(['A', 'J', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'K', 'L', 'M', 'N',
       'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
      dtype='object')

与基于列表的方法相比,使用NumPy切片对大量列更有效:

n = 10000
df = pd.DataFrame(columns=list(range(n)))

def shifter2(df, col_to_shift, pos_to_move):
    cols = df.columns.tolist()
    cols.insert(pos_to_move, cols.pop(df.columns.get_loc(col_to_shift)))
    df = df.reindex(columns=cols)
    return df

%timeit df.pipe(shifter, 590, 5)   # 381 µs
%timeit df.pipe(shifter2, 590, 5)  # 1.92 ms
 类似资料:
  • 本文向大家介绍如何在R数据帧中将列从其他位置移动到第一位置?,包括了如何在R数据帧中将列从其他位置移动到第一位置?的使用技巧和注意事项,需要的朋友参考一下 在处理大型数据集时,R数据框中列的位置特别重要。由于第一列首先出现,因此有必要按顺序排列数据框的列,以帮助我们轻松查看重要的列。为此,我们可能要更改列的位置。要将列的位置更改为第一个位置,我们可以使用单个方括号。 示例 请看以下数据帧- 假设我

  • 本文向大家介绍如何在R中制作数据帧列表?,包括了如何在R中制作数据帧列表?的使用技巧和注意事项,需要的朋友参考一下 这可以通过使用列表功能来完成。 示例 创建上述数据帧的列表-

  • 问题内容: 我有默认安装的Elasticsearch。似乎正在将其数据存储在 有两个问题: 如果我想将数据移动到同一台计算机上的另一个位置(例如,举个例子) 1)我要复制树的哪个级别?和 2)elastisearch.yml中path.data的相关设置是什么? 问题答案: 答:您需要移动文件夹,即与文件中配置的名称相同的文件夹。 B.您需要将文件中的设置修改为将数据移至的新文件夹。 因此,假设您

  • 我有一个ElasticSearch的默认安装。它似乎把它的数据存储在 2)在ellastiSearch.yml中path.data的相关设置是什么?

  • 问题内容: 我目前正在使用以下内容两次计算差异。出局非常快,因此无论如何我都不需要显示小时和分钟,它们仅是0.00。我实际上如何在Python中移动小数位? 问题答案: 与数学相同

  • 图像中的数据帧 我想将年份(2020年)和上一个第五年(2016年)之间的所有值相加,其中输入PARTNO=输入 因此,对于输入值,我应该得到4 6 2 3 2(2016 2017 2019 2020),即17 请给我一些密码