熊猫DataFrame - 重命名多个同名列

32

我有一个数据框中存在几个同名的列。我需要对它们进行重命名,但问题是df.rename方法会将它们全部重命名为相同的方式。我该如何将下面的 blah(s) 重命名为 blah1、blah4 和 blah5?

df = pd.DataFrame(np.arange(2*5).reshape(2,5))
df.columns = ['blah','blah2','blah3','blah','blah']
df

#     blah  blah2  blah3  blah  blah
# 0   0     1      2      3     4
# 1   5     6      7      8     9

当使用df.rename方法时,会发生以下情况:

df.rename(columns={'blah':'blah1'})

#     blah1  blah2  blah3  blah1  blah1
# 0   0      1      2      3      4
# 1   5      6      7      8      9
14个回答

0

这是我的解决方案:

cols = []  # for tracking if we alread seen it before
new_cols = []

for col in df.columns:
    cols.append(col)
    count = cols.count(col)
    
    if count > 1:
        new_cols.append(f'{col}_{count}')
    else:
        new_cols.append(col)

df.columns = new_cols 

你应该添加一些解释,说明为什么/如何这个解决方案与已经发布的众多其他答案不同和/或更好。 - Adrian Mole

0
这是一个优雅的解决方案:
将数据框架隔离出仅包含重复列(看起来可能是一个系列,但如果有超过1个具有该名称的列,则将是一个数据框架):
df1 = df['blah']

针对每个“blah”列,给它一个唯一的编号。
df1.columns = ['blah_' + str(int(x)) for x in range(len(df1.columns))]

将数据框中除重复列外的所有列隔离出来:

df2 = df[[x for x in df.columns if x != 'blah']]

按索引合并回来:

df3 = pd.merge(df1, df2, left_index=True, right_index=True)

就是这样:

   blah_0  blah_1  blah_2  blah2  blah3
0       0       3       4      1      2
1       5       8       9      6      7

0
在Pandas v2.1中,你可以使用pd.io.common.dedup_names函数,例如:
In [137]: pd.io.common.dedup_names(df.columns, is_potential_multiindex=False)
Out[137]: ['blah', 'blah2', 'blah3', 'blah.1', 'blah.2']

之前的方法(pd.io.parsers.base_parser.ParserBase({'names':df.columns, 'usecols':None})._maybe_dedup_names(df.columns))已被移除,因此不再有效。

0
我们可以为每一列分配不同的名称。
假设有重复的列名,例如 = [a,b,c,d,d,c] 然后只需创建一个您想要分配的名称列表:
C = [a,b,c,d,D1,C1]
df.columns = c

这对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接