我有一个包含许多列的文件,需要使用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.5
,pandas 0.25.0
答案 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
当然,如果文件的列名称中包含点,则包含该点的检查将中断。那将需要在顶部进行另一次修复。