python - 重命名数据帧切片上的列未按预期执行

标签 python pandas dataframe

我试图清理数据框中的列名,但只清理了一部分列。

尝试以某种方式替换数据框切片上的列名时它不起作用,这是为什么?

假设我们有以下数据框:
注意,底部是复制数据的可复制代码:

   Value ColAfjkj ColBhuqwa ColCouiqw
0      1        a         e         i
1      2        b         f         j
2      3        c         g         k
3      4        d         h         l

我想清理列名(预期输出):

   Value ColA ColB ColC
0      1    a    e    i
1      2    b    f    j
2      3    c    g    k
3      4    d    h    l

方法 1:

我可以像这样得到干净的列名:

df.iloc[:, 1:].columns.str[:4]

Index(['ColA', 'ColB', 'ColC'], dtype='object')

或者

方法 2:

s = df.iloc[:, 1:].columns
[col[:4] for col in s]

['ColA', 'ColB', 'ColC']

但是当我尝试覆盖列名时,没有任何反应:

df.iloc[:, 1:].columns = df.iloc[:, 1:].columns.str[:4]

   Value ColAfjkj ColBhuqwa ColCouiqw
0      1        a         e         i
1      2        b         f         j
2      3        c         g         k
3      4        d         h         l

第二种方法相同:

s = df.iloc[:, 1:].columns
cols = [col[:4] for col in s]

df.iloc[:, 1:].columns = cols

   Value ColAfjkj ColBhuqwa ColCouiqw
0      1        a         e         i
1      2        b         f         j
2      3        c         g         k
3      4        d         h         l

这确实有效,但您必须手动连接第一列的名称,这并不理想:

df.columns = ['Value'] + df.iloc[:, 1:].columns.str[:4].tolist()

   Value ColA ColB ColC
0      1    a    e    i
1      2    b    f    j
2      3    c    g    k
3      4    d    h    l

有没有更简单的方法来实现这一点?我错过了什么吗?


复制数据框:

df = pd.DataFrame({'Value':[1,2,3,4],
                   'ColAfjkj':['a', 'b', 'c', 'd'],
                   'ColBhuqwa':['e', 'f', 'g', 'h'],
                   'ColCouiqw':['i', 'j', 'k', 'l']})

最佳答案

这是因为 pandas 的索引是不可变的。如果您查看 class pandas.Index 的文档,你会看到它被定义为:

Immutable ndarray implementing an ordered, sliceable set

因此,为了修改它,您必须创建一个新的列名列表,例如:

df.columns = [df.columns[0]] + list(df.iloc[:, 1:].columns.str[:4])

另一种选择是使用 rename使用包含要替换的列的字典:

df.rename(columns=dict(zip(df.columns[1:], df.columns[1:].str[:4])))

关于python - 重命名数据帧切片上的列未按预期执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56293392/

相关文章:

python - 将 pandas df 与 how=inner 和非唯一项合并

python - pyqt在Qgraphicsscene中添加矩形

python - 将每个数字数组元素绘制为一条水平线

python - 使用pandas制作pivot_table但出现错误

Python:使用 Pandas 从 CSV 文件中删除非 ASCII 字符

python - Pandas 减去行给出了错误的结果

Python - 如何让 tqdm 在 shell 中打印一行进度条?

python - Pandas :读取列中包含特殊字符的文件

python - 如何避免输出到 jupyter notebook 中的可滚动框架?

python - pandas 数据框中的列到行