python 中相同列名的自动前导零

Automatic leading zero for same column names in python

我读取了超过 300 列的 csv。许多列的名称相似。
csv 中的缩短示例:

index   d     c     a     b     b     a     a     a
0       data  data  data  data  data  data  data  data

Python 自动在列名称的末尾添加数字(如果它们相似)作为后缀,以确保每个列都有唯一的名称。
示例:

index   d     c     a     b     b.1   a.1   a.2   a.3
0       data  data  data  data  data  data  data  data

我的任务是按字母顺序对列进行排序,并在后缀中添加零(前导零)。
期望的输出

index   a     a.01  a.02  a.03  b     b.01  c     d
0       data  data  data  data  data  data  data  data

我下面的代码(取自Whosebug)可以对列进行排序。但我不知道如何用前导零制作后缀?

import pandas as pd
df= pd.read_csv(r"C:\Users\.....\file.csv", skipinitialspace=False, sep=';', header= 0, index_col = 'DateTime', low_memory=False)

df = df.sort_index(axis=1) # sort the column
pd.set_option('display.max_columns', None) # view all columns without truncated

有什么想法吗?

已编辑问题
对列进行排序后,我想要

a.01 a02 a12

而不是

a.01 a.012 a.02

你可以这样做:

import re
df = df.rename(columns=lambda x: re.sub('\.','.0',x))

df = df.rename(columns=lambda x: x.replace('.','.0'))

输出:

      a  a.01  a.02  a.03     b  b.01     c     d
0  data  data  data  data  data  data  data  data

或者您可以决定前导零数量的另一个选项:

df = df.rename(columns=lambda x: x.split('.')[0] + '.' + x.split('.')[1].zfill(2) if '.' in x else x)

使用最后一个选项,如果列名是 b.10,则不会更改。

rename

def f(x):
  a, *b = x.rsplit('.', 1)

  return f"{a}.{int(b[0]):02d}" if b else a

df.rename(columns=f).sort_index(1)

          a  a.01  a.02  a.03     b  b.01     c     d
index                                                
0      data  data  data  data  data  data  data  data

使用字符串格式和 主要是单行代码:

import pandas as pd

df = pd.DataFrame( [["data", "data", "data", "data", "data", "data", "data", "data"], 
                    ["data", "data", "data", "data", "data", "data", "data", "data"]], 
                   columns=["a", "a.1", "a.2", "a.3", "b", "b.1", "c", "d"])

df.columns = [c.replace(c[c.find(".")+1], format(int(c[c.find(".")+1]),'02') if "." in c else c) for c in df.columns]

print(df) 

输出:

      a  a.01  a.02  a.03     b  b.01     c     d
0  data  data  data  data  data  data  data  data
1  data  data  data  data  data  data  data  data

df.columns.str

已发布答案,但想添加一个更简单的解决方案:

因为 df.columns 是一个 Index 对象,我们可以使用 .str 访问器。

他是医生 refence Doc

只是一个简短的模拟例子:

>>> df
    b.1   a.1   a.2
0  data  data  data
1  data  data  data

将需要的列直接替换为DataFrame如下:

>>> df.columns = df.columns.str.replace('.','.0')
>>> df
   b.01  a.01  a.02
0  data  data  data
1  data  data  data

OR 下面已经给出但最好使用 inplace=True 而不是分配给 df.

df.rename(columns=lambda x: x.replace('.','.0'), inplace=True)

另一种使用轴的方法:

df.rename(lambda x: x.replace('.','.0'), axis='columns', inplace=True)
print(df)
   b.01  a.01  a.02
0  data  data  data
1  data  data  data