我有一组非常旧的数据,正在清理。我已将其放入 csv 文件中,但数据逐行不一致。我想让每行中的每个字段与其之前或之后的行中的其他字段相匹配。
data = """
30,1204,PO,71100,147130,I09,B10,OC,350,20105402
31,1221,PO,70400,147170,I09,B10,OC,500,20105402
32,1223,SI,70384,147122,I09,B10,OC,500,PN,3,BO,OI,20105402
33,1224,SI,70392,147032,I09,B10,OC,500,PN,1,BO,OI,20105402
34,1227,PO,70400,146430,I09,B10,PF,500,20105402
35,1241,PO,71100,146420,I09,B10,PF,500,20105402
36,1249,PO,71100,146000,I09,B10,SN,500,20105402
37,1305,PO,70400,146000,I09,B10,OC,500,20105402
38,1307,SI,70379,146041,I09,B10,OC,500,21,BH,1,BO,195,40,SW,20105402
39,1312,SD,70372,146062,I09,B10,OC,500,20105402
40,1332,SI,70334,146309,I09,B10,OC,500,PN,4,BO,OI,20105402
41,1332,SI,70334,146309,I09,B10,OC,500,PN,5,BO,OI,20105403
42,1333,SI,70333,146324,I09,B10,OC,500,PN,2,BO,OI,20105403
43,1334,SI,70328,146348,I09,B10,OC,500,PN,1,BO,OI,20105403
44,1335,SI,70326,146356,I09,B10,OC,500,PN,1,BO,OI,20105403
45,1336,SI,70310,146424,I09,B10,OC,500,PN,1,BO,OI,20105403
46,1338,SI,70302,146457,I10,B10,OC,500,PN,1,BO,OI,20105403
47,1338,SI,70301,146464,I10,B10,OC,500,PN,1,BO,OI,20105403
48,1340,SI,70295,146503,I10,B10,OC,500,PN,8,BO,OI,20105403
49,1405,LD,2,70119,148280,I10,B10,OC,0000,20105403
01,1024,LA,1R,70120,148280,B10,OC,0000,21105501
02,1039,PO,70340,149400,I10,B10,OC,500,21105501
03,1045,SI,70378,149025,I10,B07,PF,300,PN,17,BO,OI,21105501
"""
这是数据的示例。正如您所看到的,一些线的长度相同,而另一些线的长度不同。当线的长度相同时,某些字段是逐行一致的,但当线的长度不同时,字段位于不同的位置。
我真的只是在寻找一些关于如何在Python中清理这个的想法,这样我就可以得到尽可能多的字段排列并实际上能够使用这些数据。
您可能需要考虑做的事情之一是了解额外数据的用途。
您可以首先向 csv 文件添加标题。这将有助于字段的映射。如果您不需要这些数据,您可以随时在其中添加某种行,因为
csv.reader
中的读者查看一行,看到的是额外的数据,将其删除或移动到该行的末尾,然后您也可以将该数据的标题放在行尾。
如果没有上下文,我们就不可能做出明确的答案。开始的方法如下:根据
,
分割每一行,并根据每行中的项目数创建数据框。
然后您可以根据您的需求进一步清理您的数据:
from io import StringIO
import pandas as pd
data = """
30,1204,PO,71100,147130,I09,B10,OC,350,20105402
31,1221,PO,70400,147170,I09,B10,OC,500,20105402
32,1223,SI,70384,147122,I09,B10,OC,500,PN,3,BO,OI,20105402
33,1224,SI,70392,147032,I09,B10,OC,500,PN,1,BO,OI,20105402
34,1227,PO,70400,146430,I09,B10,PF,500,20105402
35,1241,PO,71100,146420,I09,B10,PF,500,20105402
36,1249,PO,71100,146000,I09,B10,SN,500,20105402
37,1305,PO,70400,146000,I09,B10,OC,500,20105402
38,1307,SI,70379,146041,I09,B10,OC,500,21,BH,1,BO,195,40,SW,20105402
39,1312,SD,70372,146062,I09,B10,OC,500,20105402
40,1332,SI,70334,146309,I09,B10,OC,500,PN,4,BO,OI,20105402
41,1332,SI,70334,146309,I09,B10,OC,500,PN,5,BO,OI,20105403
42,1333,SI,70333,146324,I09,B10,OC,500,PN,2,BO,OI,20105403
43,1334,SI,70328,146348,I09,B10,OC,500,PN,1,BO,OI,20105403
44,1335,SI,70326,146356,I09,B10,OC,500,PN,1,BO,OI,20105403
45,1336,SI,70310,146424,I09,B10,OC,500,PN,1,BO,OI,20105403
46,1338,SI,70302,146457,I10,B10,OC,500,PN,1,BO,OI,20105403
47,1338,SI,70301,146464,I10,B10,OC,500,PN,1,BO,OI,20105403
48,1340,SI,70295,146503,I10,B10,OC,500,PN,8,BO,OI,20105403
49,1405,LD,2,70119,148280,I10,B10,OC,0000,20105403
01,1024,LA,1R,70120,148280,B10,OC,0000,21105501
02,1039,PO,70340,149400,I10,B10,OC,500,21105501
03,1045,SI,70378,149025,I10,B07,PF,300,PN,17,BO,OI,21105501
"""
all_data = {}
for line in map(str.strip, data.splitlines()):
if line == "":
continue
line = line.split(",")
all_data.setdefault(len(line), []).append(line)
for v in all_data.values():
df = pd.DataFrame(v)
print(df)
print("-" * 80)
打印:
0 1 2 3 4 5 6 7 8 9
0 30 1204 PO 71100 147130 I09 B10 OC 350 20105402
1 31 1221 PO 70400 147170 I09 B10 OC 500 20105402
2 34 1227 PO 70400 146430 I09 B10 PF 500 20105402
3 35 1241 PO 71100 146420 I09 B10 PF 500 20105402
4 36 1249 PO 71100 146000 I09 B10 SN 500 20105402
5 37 1305 PO 70400 146000 I09 B10 OC 500 20105402
6 39 1312 SD 70372 146062 I09 B10 OC 500 20105402
7 01 1024 LA 1R 70120 148280 B10 OC 0000 21105501
8 02 1039 PO 70340 149400 I10 B10 OC 500 21105501
--------------------------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 12 13
0 32 1223 SI 70384 147122 I09 B10 OC 500 PN 3 BO OI 20105402
1 33 1224 SI 70392 147032 I09 B10 OC 500 PN 1 BO OI 20105402
2 40 1332 SI 70334 146309 I09 B10 OC 500 PN 4 BO OI 20105402
3 41 1332 SI 70334 146309 I09 B10 OC 500 PN 5 BO OI 20105403
4 42 1333 SI 70333 146324 I09 B10 OC 500 PN 2 BO OI 20105403
5 43 1334 SI 70328 146348 I09 B10 OC 500 PN 1 BO OI 20105403
6 44 1335 SI 70326 146356 I09 B10 OC 500 PN 1 BO OI 20105403
7 45 1336 SI 70310 146424 I09 B10 OC 500 PN 1 BO OI 20105403
8 46 1338 SI 70302 146457 I10 B10 OC 500 PN 1 BO OI 20105403
9 47 1338 SI 70301 146464 I10 B10 OC 500 PN 1 BO OI 20105403
10 48 1340 SI 70295 146503 I10 B10 OC 500 PN 8 BO OI 20105403
11 03 1045 SI 70378 149025 I10 B07 PF 300 PN 17 BO OI 21105501
--------------------------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
0 38 1307 SI 70379 146041 I09 B10 OC 500 21 BH 1 BO 195 40 SW 20105402
--------------------------------------------------------------------------------
0 1 2 3 4 5 6 7 8 9 10
0 49 1405 LD 2 70119 148280 I10 B10 OC 0000 20105403
--------------------------------------------------------------------------------