Python 如何将改变结构的csv读入数据帧
我试图通过read_csv导入的csv给我带来了麻烦,因为中的某些行缺少值,这会导致尾随逗号,从而搞乱了如何将其读取到数据帧中 数据来自 CSV示例行Python 如何将改变结构的csv读入数据帧,python,pandas,csv,Python,Pandas,Csv,我试图通过read_csv导入的csv给我带来了麻烦,因为中的某些行缺少值,这会导致尾随逗号,从而搞乱了如何将其读取到数据帧中 数据来自 CSV示例行 df=pd.read\u csv('test.csv',header=None) #结果 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 0 1121593 2017年8月26日20
df=pd.read\u csv('test.csv',header=None)
#结果
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
0 1121593 2017年8月26日2017年8月26日117814462245-49M 101616111775352162365.6600009 15 3
1121594 2017年8月26日2017年8月26日45-49米10141442650 72 128.279988 4 1
渴望的
011234567891011214
0 1121593 26/08/2017 26/08/2017 1178.0 144622.0 45-49 M 10 16 1177535 221 365.660001 15 3
1121594 2017年8月26日2017年8月26日南南45-49米1014141426500 72 128.2799994 1
对如何处理这些数据有什么建议吗?理想情况下,缺失的值(第二行45-49之前)将显示为NaN。- 问题是数据集
- 从第762行(索引为0)开始,数据不再包含
和'campaign\u id'
'fb\u campaign\u id'
- 我建议将数据读入两个独立的数据帧
- 将带有
值的缺失列添加到None
df2
- 对
列进行排序,以匹配df2
df1
- 合并这两个数据帧
- 中存在问题的数据集似乎是的副本,而该副本没有此问题。
- 如本数据集中所述
- 因此,在没有附加问题的情况下使用数据集可能是最简单的
将熊猫作为pd导入
#通读第761行
df1=pd.read_csv('data.csv',skiprows=range(7621145))
#为数据的第二部分创建不同的标题
cols=df1.columns[:3].tolist()+df1.columns[5::].tolist()
#从第762行读取并跳过两个空白结束列
df2=pd.read\u csv('data.csv',header=None,names=cols,skiprows=range(762),usecols=range(13))
#将缺少的列添加到df2
df2[['campaign_id','fb_campaign_id']]=无
#按与df1相同的顺序对df2列进行排序
df2=df2.reindex(df1.columns,轴=1)
#合并两个数据帧
df=pd.concat([df1,df2])。重置索引(drop=True)
df
-头部和尾部
df1
-头部和尾部
df2
-头部和尾部
当您得到有已知故障的坏数据集时,一个好的解决方案是清除数据并将好的数据写回磁盘。该代码只需在下载后运行,而您的其他代码不会因修复程序的错误而负担过重。这最好使用csv模块来完成,我们可以逐行修复 kaggle_campaign_data_fixer.py
import sys
import csv
from pathlib import Path
filename = Path(sys.argv[1])
newname = filename.parent/f"{filename.stem}-fixed{filename.suffix}"
BADCOLS = ['', '']
with open(filename, newline='') as infile, open(newname, 'w', newline='') as outfile:
writer = csv.writer(outfile)
for row in csv.reader(infile):
if row[-2:] == BADCOLS:
row[3:3] = BADCOLS
del row[-2:]
writer.writerow(row)
# test it
import pandas as pd
df = pd.read_csv(filename, header=None)
print(df)
print("""
============== FIXED ==================
""")
df = pd.read_csv(newname, header=None)
print(df)
ad_id reporting_start reporting_end campaign_id fb_campaign_id age gender interest1 interest2 interest3 impressions clicks spent total_conversion approved_conversion
708746 17/08/2017 17/08/2017 916 103916 30-34 M 15 17 17 7350 1 1.43 2 1
708749 17/08/2017 17/08/2017 916 103917 30-34 M 16 19 21 17861 2 1.82 2 0
708771 17/08/2017 17/08/2017 916 103920 30-34 M 20 25 22 693 0 0.00 1 0
708815 30/08/2017 30/08/2017 916 103928 30-34 M 28 32 32 4259 1 1.25 1 0
708818 17/08/2017 17/08/2017 916 103928 30-34 M 28 33 32 4133 1 1.29 1 1
1314410 19/08/2017 19/08/2017 None None 45-49 F 109 111 114 1129773 252 358.189997 13 2
1314411 19/08/2017 19/08/2017 None None 45-49 F 110 111 116 637549 120 173.880003 3 0
1314412 19/08/2017 19/08/2017 None None 45-49 F 111 113 117 151531 28 40.289999 2 0
1314414 17/08/2017 17/08/2017 None None 45-49 F 113 114 117 790253 135 198.710000 8 2
1314415 17/08/2017 17/08/2017 None None 45-49 F 114 116 118 513161 114 165.609999 5 2
ad_id reporting_start reporting_end campaign_id fb_campaign_id age gender interest1 interest2 interest3 impressions clicks spent total_conversion approved_conversion
708746 17/08/2017 17/08/2017 916 103916 30-34 M 15 17 17 7350 1 1.43 2 1
708749 17/08/2017 17/08/2017 916 103917 30-34 M 16 19 21 17861 2 1.82 2 0
708771 17/08/2017 17/08/2017 916 103920 30-34 M 20 25 22 693 0 0.00 1 0
708815 30/08/2017 30/08/2017 916 103928 30-34 M 28 32 32 4259 1 1.25 1 0
708818 17/08/2017 17/08/2017 916 103928 30-34 M 28 33 32 4133 1 1.29 1 1
1121585 20/08/2017 20/08/2017 1178 144621 40-44 M 66 72 68 9773 1 1.460000 1 0
1121589 20/08/2017 20/08/2017 1178 144622 45-49 M 10 16 11 464036 77 123.550000 3 1
1121590 20/08/2017 20/08/2017 1178 144622 45-49 M 10 16 15 478480 75 135.750001 3 1
1121592 20/08/2017 20/08/2017 1178 144622 45-49 M 10 14 11 428812 66 116.880000 4 2
1121593 26/08/2017 26/08/2017 1178 144622 45-49 M 10 16 16 1177535 221 365.660001 15 3
ad_id reporting_start reporting_end age gender interest1 interest2 interest3 impressions clicks spent total_conversion approved_conversion
1121594 26/08/2017 26/08/2017 45-49 M 10 14 14 426500 72 128.279999 4 1
1121597 30/08/2017 30/08/2017 45-49 M 15 21 19 54237 7 10.780000 2 1
1121598 30/08/2017 30/08/2017 45-49 M 15 19 18 506916 89 133.699999 2 2
1121599 30/08/2017 30/08/2017 45-49 M 15 17 18 250960 42 64.880000 2 0
1121601 30/08/2017 30/08/2017 45-49 M 16 20 18 2286228 353 603.380002 16 7
1314410 19/08/2017 19/08/2017 45-49 F 109 111 114 1129773 252 358.189997 13 2
1314411 19/08/2017 19/08/2017 45-49 F 110 111 116 637549 120 173.880003 3 0
1314412 19/08/2017 19/08/2017 45-49 F 111 113 117 151531 28 40.289999 2 0
1314414 17/08/2017 17/08/2017 45-49 F 113 114 117 790253 135 198.710000 8 2
1314415 17/08/2017 17/08/2017 45-49 F 114 116 118 513161 114 165.609999 5 2
import sys
import csv
from pathlib import Path
filename = Path(sys.argv[1])
newname = filename.parent/f"{filename.stem}-fixed{filename.suffix}"
BADCOLS = ['', '']
with open(filename, newline='') as infile, open(newname, 'w', newline='') as outfile:
writer = csv.writer(outfile)
for row in csv.reader(infile):
if row[-2:] == BADCOLS:
row[3:3] = BADCOLS
del row[-2:]
writer.writerow(row)
# test it
import pandas as pd
df = pd.read_csv(filename, header=None)
print(df)
print("""
============== FIXED ==================
""")
df = pd.read_csv(newname, header=None)
print(df)