读取csv文件中的重复列名

时间:2020-01-27 17:11:10

标签: python pandas csv dataframe

我有一个包含许多列的文件,需要使用pandas读取其中的一些列。问题是我需要的列之间有重复的名称。在这种情况下,参数mangle_dupe_cols似乎不起作用。它只是返回我要求的列的第一次出现。


示例

import pandas as pd
from io import StringIO

csv = r'''a;b;c;d;c;d;e;f
1;11;21;31;41;51;61;71
2;12;22;32;42;52;62;72
3;13;23;33;43;53;63;73
4;14;24;34;44;54;64;74
5;15;25;35;45;55;65;75'''

如果我读取了整个文件,但未指定要读取的列,则会得到预期的答案:

df = pd.read_csv( StringIO(csv), 
        sep=';', header=0)

print( df )

   a   b   c   d  c.1  d.1   e   f
0  1  11  21  31   41   51  61  71
1  2  12  22  32   42   52  62  72
2  3  13  23  33   43   53  63  73
3  4  14  24  34   44   54  64  74
4  5  15  25  35   45   55  65  75

但是,我只想指定一些列,例如:

df = pd.read_csv( StringIO(csv), 
        usecols=[ 'b', 'c', 'd', 'c', 'd',], 
        sep=';', header=0)

print( df )

...在这种情况下,我只会第一次出现重复的列:

    b   c   d
0  11  21  31
1  12  22  32
2  13  23  33
3  14  24  34
4  15  25  35

由于文件太大,我想避免读取整个文件,查找列并删除不需要的列。

是否可以使用pandas.read_csv()指定列并获取重复的列?

如果有任何提示,我将不胜感激!


使用python 3.7.5pandas 0.25.0

2 个答案:

答案 0 :(得分:1)

尝试使用此:

In [40]:

df = pd.read_csv('tmp.csv', index_col=0)
df
Out[44]:
a   b   a.1
0   4   2   1
1   5   3   2
2   6   4   3
In [41]:

df = pd.read_csv('tmp.csv', index_col=0, nrows=0)
# read only column names
In [42]:

df
Out[42]:
a   b   a.1
In [36]:

use_col = [col_name for col_name in list(df.columns) if col_name.startswith('a')]
# check how many columns we have and save them to the separate list
In [39]:

df = pd.read_csv('tmp.csv', usecols=use_col)
In [40]:

df
Out[40]:
a   a.1
0   4   1
1   5   2
2   6   3
In [ ]:

答案 1 :(得分:0)

为了完整起见,我在that of CezarySzulc之后发布了这个答案,以作为文档的补充。

诀窍是首先利用pandas的功能来检测和重命名列,进行更改,然后读取实际文件。

以问题中的示例为例:

import pandas as pd
from io import StringIO

csv = r'''a;b;c;d;c;d;e;f
1;11;21;31;41;51;61;71
2;12;22;32;42;52;62;72
3;13;23;33;43;53;63;73
4;14;24;34;44;54;64;74
5;15;25;35;45;55;65;75'''

以下两行使其起作用:

# Get lines in the file, repeated ones will have a suffix already
cols_in_file = list( pd.read_csv( StringIO(csv), sep=';', nrows=1 ) )
# Select only the columns desired, using the point to check for the repeated
cols_to_read = [ c for c in cols_in_file if c.split('.')[0] in [ 'b', 'c', 'd', 'c', 'd',] ]

df = pd.read_csv( StringIO(csv), 
        usecols=cols_to_read, 
        sep=';', header=0)

print( df )

    b   c   d  c.1  d.1
0  11  21  31   41   51
1  12  22  32   42   52
2  13  23  33   43   53
3  14  24  34   44   54
4  15  25  35   45   55

此方法的优点是它可以与任意数量的重复列一起使用,而无需更改代码:

csv = r'''a;b;c;d;c;d;e;f;c
1;11;21;31;41;51;61;71;81
2;12;22;32;42;52;62;72;82
3;13;23;33;43;53;63;73;83
4;14;24;34;44;54;64;74;84
5;15;25;35;45;55;65;75;85'''

cols_in_file = list( pd.read_csv( StringIO(csv), sep=';', nrows=1 ) )
cols_to_read = [ c for c in cols_in_file if c.split('.')[0] in [ 'b', 'c', 'd', 'c', 'd',] ]

df = pd.read_csv( StringIO(csv), 
        usecols=cols_to_read, 
        sep=';', header=0)

print( df )

    b   c   d  c.1  d.1  c.2
0  11  21  31   41   51   81
1  12  22  32   42   52   82
2  13  23  33   43   53   83
3  14  24  34   44   54   84
4  15  25  35   45   55   85

当然,如果文件的列名称中包含点,则包含该点的检查将中断。那将需要在顶部进行另一次修复。