从pandas.read_csv()中删除重复的列

时间:2018-05-04 16:24:49

标签: python python-3.x pandas

默认情况下,pandas.read_csv()会以X,X.1,...,X.N的形式破坏重复的CSV标头。

标志mangle_dupe_cols = False返回:

ValueError: Setting mangle_dupe_cols=False is not supported yet

这对我来说似乎是愚蠢的,为什么你会允许布尔标志,但禁用布尔值......

有没有办法通过pandas API最适合通过read_csv()方法在DataFrame初始化时检测/删除重复的标头?

可能的解决方案(非API)

headers = set(df.columns) # will include 'X' and 'X.1'
n = 0
unique = []
for i in range(len(headers)):
    d = 1
    if i != n:
        continue # skip dupes
    elif (headers[i] + '.' + str(d)) in headers:
        while True: # find next unique element
            d += 1
            n += 1
            if (headers[i] + '.' + str(d)) not in headers:
                break
    unique.append(headers[i])
    n += 1

2 个答案:

答案 0 :(得分:2)

我可能会做类似

的事情
In [22]: df = pd.read_csv("dup.col")

In [23]: df
Out[23]: 
   A  A.1  B  C  C.1  C.2  D  E  C.3
0  1    2  3  4    5    6  7  8    9
1  1    2  3  4    5    6  7  8    9

In [24]: df.loc[:, ~df.columns.str.replace("(\.\d+)$", "").duplicated()]
Out[24]: 
   A  B  C  D  E
0  1  3  4  7  8
1  1  3  4  7  8

(稍微粗略一点,我们也可以处理非字符串列,但也许是YAGNI。)

答案 1 :(得分:0)

这是我的单行,假设您的列名中没有点字符。

df = df.loc[:,df.columns.str.find('.') < 0]