我有一个包含两级列索引的数据框。
可重现的数据集。
df = pd.DataFrame(
[ ['Gaz','Gaz','Gaz','Gaz'],
['X','X','X','X'],
['Y','Y','Y','Y'],
['Z','Z','Z','Z']],
columns=pd.MultiIndex.from_arrays([['A','A','C','D'],
['Name','Name','Company','Company']])
我想重命名重复的 MultiIndex 列,仅当 level-0 和 level-1 组合重复时。然后在末尾添加一个后缀数字。就像下面的那个。
下面是我找到的一个解决方案,但它只适用于单级列索引。
class renamer():
def __init__(self):
self.d = dict()
def __call__(self, x):
if x not in self.d:
self.d[x] = 0
return x
else:
self.d[x] += 1
return "%s_%d" % (x, self.d[x])
df = df.rename(columns=renamer())
我认为可以修改上述方法以支持多级情况,但我对 pandas/python 太陌生了。
提前致谢。
@Datanovice 这是为了向您澄清我需要的输出。我有下面的片段。
import pandas as pd
import numpy as np
df = pd.DataFrame(
[ ['Gaz','Gaz','Gaz','Gaz'],
['X','X','X','X'],
['Y','Y','Y','Y'],
['Z','Z','Z','Z']],
columns=pd.MultiIndex.from_arrays([
['A','A','C','A'],
['A','A','C','A'],
['Company','Company','Company','Name']]))
s = pd.DataFrame(df.columns.tolist())
cond = s.groupby(0).cumcount()
s = [np.where(cond.gt(0),s[i] + '_' + cond.astype(str),s[i]) for i in
range(df.columns.nlevels)]
s = pd.DataFrame(s)
#print(s)
df.columns = pd.MultiIndex.from_arrays(s.values.tolist())
print(df)
目前的结果是——
我需要的是最后一段列索引不应该算作重复,因为“AA-Name”与前两个不一样。
萧十郎
SMILET
相关分类