我的格式错误的“csv”文件:
txt = """NAME;a;b;c
ATTR1;1;2;3
ATTR2;1;2;3;;;
ATTR3;1;2;3;
ATTR4;1;2;3"""
我有办法使用pandas
pd.read_*
工具箱来获取以下pd.DataFrame
:
|---+-------+---+---+---|
| | 0 | 1 | 2 | 3 |
|---+-------+---+---+---|
| 0 | NAME | a | b | c |
| 1 | ATTR1 | 1 | 2 | 3 |
| 2 | ATTR2 | 1 | 2 | 3 |
| 3 | ATTR3 | 1 | 2 | 3 |
| 4 | ATTR4 | 1 | 2 | 3 |
|---+-------+---+---+---|
P.S。我知道如何使用import csv
感谢你的想法和BR, 莱克斯
修改
这是来自真实档案的玩具示例(我再次必须修改)......
SRC = 'https://dl.dropboxusercontent.com/u/40513206/test.csv'
NA_VALUES = ['', '#N/A N/A', '#N/A Field Not Applicable', '#N/A Invalid Field',
'#N/A Invalid Security', '#N/AN/A', '#N/A Limit', '#####', '#DIV/0!',
'#N/A', '#NAME?', '#NULL!', '#NUM!', '#REF!', '#VALUE!']
CSV_ENCODING = 'WINDOWS-1252'
S_ROWS = 6
NR_ROWS = 60
NR_COLS = 52 # correct nr. of columns, but not always known
dat_m = pd.read_csv(SRC, sep = ';', header = None, index_col = None, skiprows = S_ROWS,
nrows = NR_ROWS, encoding = CSV_ENCODING, na_values = NA_VALUES, names = range(NR_COLS))
似乎如果我们使用names
参数,那么NR_COLS
必须是>=
实际nr。第一行中的列,如果不是这样,则形成Index
或MultiIndex
(基于实际列),例如,如果NR_COLS = 50
则索引有2个级别,如果{{1}然后3级等。
当我将NR_COLS = 49
保存到Excel
时,所有这些都是结果,它似乎会将csv
添加到某些行中,而出于其他原因,我无法使用sep = ';'
(直接读取文件。
因此,我将使用较大的xls
值或继续使用NR_COLS
库。
谢谢!
答案 0 :(得分:5)
怎么样:
>>> txt = 'NAME;a;b;c\nATTR1;1;2;3\nATTR2;1;2;3;;;\nATTR3;1;2;3;\nATTR4;1;2;3'
>>> pd.read_csv(StringIO(txt),sep=";",names=range(4))
0 1 2 3
0 NAME a b c
1 ATTR1 1 2 3
2 ATTR2 1 2 3
3 ATTR3 1 2 3
4 ATTR4 1 2 3
[5 rows x 4 columns]
有时当我事先不知道有多少列时,我会做一些愚蠢的事情,比如names=range(128)
然后.dropna(how='all', axis=1)
。