如何使用df.add_suffix为Pandas中重复的列名添加后缀?

kr98yfug  于 2023-05-12  发布在  其他
关注(0)|答案(4)|浏览(144)

我有一个400列的大型数据框架。其中200个列名与前200个列名重复。如何使用df.add_suffix仅为重复的列名添加后缀?
有没有更好的方法可以自动完成?

kkih6yb8

kkih6yb81#

以下是我的解决方案,从以下开始:

df=pd.DataFrame(np.arange(4).reshape(1,-1),columns=['a','b','a','b'])

输出

a b a b
0 1 2 3 4

然后我使用Lambda函数

df.columns = df.columns+np.vectorize(lambda x:'_' if x else '')(df.columns.duplicated())

输出

a   b   a_  b_
0   0   1   2   3

如果你有一个以上的副本,那么你可以循环,直到没有留下。这也适用于重复的索引,它还保留了索引名称。

vnjpjtjt

vnjpjtjt2#

如果我没理解错的话,每个名字都有两次。如果是这样,可以使用df.columns.duplicated()请求重复的值。然后,您可以创建一个新的列表,只需修改重复的值并添加自定义的后缀。这与其他发布的修改所有条目的解决方案不同。

df = pd.DataFrame(data=[[1, 2, 3, 4]], columns=list('aabb'))
my_suffix = 'T'

df.columns = [name if duplicated == False else name + my_suffix for duplicated, name in zip(df.columns.duplicated(), df.columns)]
df
>>>
   a  aT  b  bT
0  1   2  3   4

我的答案有一个缺点,如果一个名字被使用了三次或更多次, Dataframe 可能会有重复的列名。

pkln4tw6

pkln4tw63#

您可以执行以下操作:

import pandas as pd

# setup dummy DataFrame with repeated columns
df = pd.DataFrame(data=[[1, 2, 3]], columns=list('aaa'))

# create unique identifier for each repeated column
identifier = df.columns.to_series().groupby(level=0).transform('cumcount')

# rename columns with the new identifiers
df.columns = df.columns.astype('string') + identifier.astype('string')

print(df)

输出

a0  a1  a2
0   1   2   3

如果只有一个重复列,则可以执行以下操作:

# setup dummy DataFrame with repeated columns
df = pd.DataFrame(data=[[1, 2, 3, 4]], columns=list('aabb'))

# create unique identifier for each repeated column
identifier = df.columns.duplicated().astype(int)

# rename columns with the new identifiers
df.columns = df.columns.astype('string') + identifier.astype(str)

print(df)

输出*(仅限一个副本)*

a0  a1  b0  b1
0   1   2   3   4
w6lpcovy

w6lpcovy4#

添加以“_1”开头的编号后缀,该后缀以第一个重复列开头,适用于出现多次的列。
例如,列名称列表:[a,B,c,a,b,a]将返回[a,b,c,a_1,b_1,a_2]

from collections import Counter

counter = Counter()
empty_list= []

for x in range(df.shape[1]):
  counter.update([df.columns[x]])
  if counter[df.columns[x]] == 1:
    empty_list.append(df.columns[x])
  else: 
    tx = counter[df.columns[x]] -1
    empty_list.append(df.columns[x] + '_' + str(tx))

df.columns = empty_list
df.columns

相关问题