gpt4 book ai didi

python - 如何移动 Pandas 数据框中的列

转载 作者:太空宇宙 更新时间:2023-11-03 13:58:19 25 4
gpt4 key购买 nike

我想将索引为“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: must be str, not list

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

还有,有没有一种通用的方法可以通过标签将任意列移动到指定位置?我的专栏只有一级,即不涉及 MultiIndex

最佳答案

更正错误

I'm not sure how to interpret this error because it actually should bea list, right?

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

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

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

通用解决方案

但是将数组转换为列表,然后手动连接列表不仅成本高昂,而且容易出错。 related answer有许多基于列表的解决方案,但基于 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

关于python - 如何移动 Pandas 数据框中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52616829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com