感谢 @Lamakaha 提供的解决方案。你的想法让我有机会修改它并使其在所有情况下都可行。
我正在使用Python 3.7.3版本。
我在我的数据集上尝试了你的代码片段,其中只有一个重复的列,即两个具有相同名称的列。不幸的是,列名保持不变,没有被重命名。最重要的是,我收到了一个警告,提示
"get_duplicates()
已弃用,将在未来版本中删除"。我使用
duplicated()
与
unique()
代替
get_duplicates()
,但没有产生预期的结果。
我稍微修改了你的代码,现在它适用于我的数据集以及其他一般情况。
以下是在问题中提到的示例数据集上运行代码的结果,包括有无代码修改的情况:
df=pd.DataFrame(np.arange(2*5).reshape(2,5))
df.columns=['blah','blah2','blah3','blah','blah']
df
cols=pd.Series(df.columns)
for dup in df.columns.get_duplicates():
cols[df.columns.get_loc(dup)]=[dup+'.'+str(d_idx) if d_idx!=0 else dup for d_idx in range(df.columns.get_loc(dup).sum())]
df.columns=cols
df
f:\Anaconda3\lib\site-packages\ipykernel_launcher.py:2: FutureWarning:
'get_duplicates'已经被弃用,将在将来的版本中删除,
您可以使用idx[idx.duplicated()].unique()代替
输出:
blah blah2 blah3 blah blah.1
0 0 1 2 3 4
1 5 6 7 8 9
三个“blah”中的两个没有被正确重命名。
修改后的代码
df=pd.DataFrame(np.arange(2*5).reshape(2,5))
df.columns=['blah','blah2','blah3','blah','blah']
df
cols=pd.Series(df.columns)
for dup in cols[cols.duplicated()].unique():
cols[cols[cols == dup].index.values.tolist()] = [dup + '.' + str(i) if i != 0 else dup for i in range(sum(cols == dup))]
df.columns=cols
df
输出:
blah blah2 blah3 blah.1 blah.2
0 0 1 2 3 4
1 5 6 7 8 9
最初的回答:
这里是对另一个示例代码进行修改后的运行结果:
cols = pd.Series(['X', 'Y', 'Z', 'A', 'B', 'C', 'A', 'A', 'L', 'M', 'A', 'Y', 'M'])
for dup in cols[cols.duplicated()].unique():
cols[cols[cols == dup].index.values.tolist()] = [dup + '_' + str(i) if i != 0 else dup for i in range(sum(cols == dup))]
cols
Output:
0 X
1 Y
2 Z
3 A
4 B
5 C
6 A_1
7 A_2
8 L
9 M
10 A_3
11 Y_1
12 M_1
dtype: object
希望这能帮助到寻找上述问题答案的任何人。最初的回答:
pandas.io.parsers.base_parser
导入ParserBase。(我不知道它是否已经移至pandas.io.parsers.base_parser
或不再从pandas.io.parsers
导出。)仍然需要{'usecols': None}
。 - mikm