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
我读取了超过 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