自动重命名列以确保它们是唯一的

时间:2013-09-28 21:01:06

标签: python pandas

我将电子表格提取到名为df

的Python DataFrame中

我们举一个例子:

df=pd.DataFrame({'a': np.random.rand(10), 'b': np.random.rand(10)})
df.columns=['a','a']

          a         a
0  0.973858  0.036459
1  0.835112  0.947461
2  0.520322  0.593110
3  0.480624  0.047711
4  0.643448  0.104433
5  0.961639  0.840359
6  0.848124  0.437380
7  0.579651  0.257770
8  0.919173  0.785614
9  0.505613  0.362737

当我运行df.columns.is_unique时,我得到False

我想自动将列'a'重命名为'a_2'(或类似的东西)

我不希望像df.columns=['a','a_2']

这样的解决方案

我正在寻找可用于多个列的解决方案!

3 个答案:

答案 0 :(得分:9)

您可以手动统一列:

df_columns = ['a', 'b', 'a', 'a_2', 'a_2', 'a', 'a_2', 'a_2_2']

def uniquify(df_columns):
    seen = set()

    for item in df_columns:
        fudge = 1
        newitem = item

        while newitem in seen:
            fudge += 1
            newitem = "{}_{}".format(item, fudge)

        yield newitem
        seen.add(newitem)

list(uniquify(df_columns))
#>>> ['a', 'b', 'a_2', 'a_2_2', 'a_2_3', 'a_3', 'a_2_4', 'a_2_2_2']

答案 1 :(得分:2)

  

我将电子表格提取到名为df的Python DataFrame中...我想   自动重命名[复制]列[名称]。

Pandas会自动为您做到这一点,而无需您做任何事情......

TEST.XLS: enter image description here

import pandas as pd
import numpy as np

df = pd.io.excel.read_excel(
    "./test.xls", 
    "Sheet1",
    header=0,
    index_col=0,
)
print df

--output:--
        a    b   c  b.1  a.1  a.2
index                            
0      10  100 -10 -100   10   21
1      20  200 -20 -200   11   22
2      30  300 -30 -300   12   23
3      40  400 -40 -400   13   24
4      50  500 -50 -500   14   25
5      60  600 -60 -600   15   26


print df.columns.is_unique

--output:--
True

如果出于某种原因,您将获得包含重复列的 DataFrame ,则可以执行以下操作:

import pandas as pd
import numpy as np
from collections import defaultdict 

df = pd.DataFrame(
    {
        'k': np.random.rand(10),
        'l': np.random.rand(10), 
        'm': np.random.rand(10),
        'n': np.random.rand(10),
        'o': np.random.rand(10),
        'p': np.random.rand(10),
    }
)

print df

--output:--
         k         l         m         n         o         p
0  0.566150  0.025225  0.744377  0.222350  0.800402  0.449897
1  0.701286  0.182459  0.661226  0.991143  0.793382  0.980042
2  0.383213  0.977222  0.404271  0.050061  0.839817  0.779233
3  0.428601  0.303425  0.144961  0.313716  0.244979  0.487191
4  0.187289  0.537962  0.669240  0.096126  0.242258  0.645199
5  0.508956  0.904390  0.838986  0.315681  0.359415  0.830092
6  0.007256  0.136114  0.775670  0.665000  0.840027  0.991058
7  0.719344  0.072410  0.378754  0.527760  0.205777  0.870234
8  0.255007  0.098893  0.079230  0.225225  0.490689  0.554835
9  0.481340  0.300319  0.649762  0.460897  0.488406  0.16604


df.columns = ['a', 'b', 'c', 'b', 'a', 'a']
print df

--output:--
          a         b         c         b         a         a
0  0.566150  0.025225  0.744377  0.222350  0.800402  0.449897
1  0.701286  0.182459  0.661226  0.991143  0.793382  0.980042
2  0.383213  0.977222  0.404271  0.050061  0.839817  0.779233
3  0.428601  0.303425  0.144961  0.313716  0.244979  0.487191
4  0.187289  0.537962  0.669240  0.096126  0.242258  0.645199
5  0.508956  0.904390  0.838986  0.315681  0.359415  0.830092
6  0.007256  0.136114  0.775670  0.665000  0.840027  0.991058
7  0.719344  0.072410  0.378754  0.527760  0.205777  0.870234
8  0.255007  0.098893  0.079230  0.225225  0.490689  0.554835
9  0.481340  0.300319  0.649762  0.460897  0.488406  0.166047


print df.columns.is_unique

--output:--
False  


name_counts = defaultdict(int)
new_col_names = []

for name in df.columns:
    new_count = name_counts[name] + 1
    new_col_names.append("{}{}".format(name, new_count))
    name_counts[name] = new_count 

print new_col_names


--output:--
['a1', 'b1', 'c1', 'b2', 'a2', 'a3']


df.columns = new_col_names
print df

--output:--
         a1        b1        c1        b2        a2        a3
0  0.264598  0.321378  0.466370  0.986725  0.580326  0.671168
1  0.938810  0.179999  0.403530  0.675112  0.279931  0.011046
2  0.935888  0.167405  0.733762  0.806580  0.392198  0.180401
3  0.218825  0.295763  0.174213  0.457533  0.234081  0.555525
4  0.891890  0.196245  0.425918  0.786676  0.791679  0.119826
5  0.721305  0.496182  0.236912  0.562977  0.249758  0.352434
6  0.433437  0.501975  0.088516  0.303067  0.916619  0.717283
7  0.026491  0.412164  0.787552  0.142190  0.665488  0.488059
8  0.729960  0.037055  0.546328  0.683137  0.134247  0.444709
9  0.391209  0.765251  0.507668  0.299963  0.348190  0.731980

print df.columns.is_unique

--output:--
True

答案 2 :(得分:0)

从oracle表加载DataFrame时遇到了这个问题。 7stud是正确的,pd.read_excel()使用* .1自动指定重复列,但并非所有读取函数都执行此操作。一种解决方法是将DataFrame保存到csv(或excel)文件,然后重新加载它以重新指定重复的列。

data = pd.read_SQL(SQL,connection)
data.to_csv(r'C:\temp\temp.csv')
data=read_csv(r'C:\temp\temp.csv')