重命名dataframe切片上的列未按预期执行

2024-10-02 14:21:32 发布

您现在位置:Python中文网/ 问答频道 /正文

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

当试图以某种方式替换数据帧片段上的列名时,它不起作用,这是为什么?在

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

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

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

^{pr2}$

方法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']})

Tags: columns数据方法dfforvaluecolstr
2条回答

这是因为熊猫的指数是不变的。如果您检查文档中的^{},您将看到它被定义为:

Immutable ndarray implementing an ordered, sliceable set

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

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

另一个选择是将^{}与包含要替换的列的字典一起使用:

^{pr2}$

要覆盖列名称,可以使用.rename()方法:

所以,它看起来像:

df.rename(columns={'ColA_fjkj':'ColA',
                   'ColB_huqwa':'ColB',
                   'ColC_ouiqw':'ColC'}
          , inplace=True)

有关重命名的更多信息,请参阅文档:https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.rename.html

相关问题 更多 >