有一个相对较大的包含数据的 CSV 文件(大约 80Mb)。当我在 MS Excel 中打开它时,我看到它包含 100 列和许多行数据。但是,第一行不是列名,而是一个 Web 链接。此外,最后两行是一些评论。 所以,现在我想将这些数据加载到 pandas DataFrame 中:
import pandas as pd
df = pd.read_csv('myfile.csv')
然后我想读取一个名为 Duration
的列(我看到它存在于 CSV 文件中)并从它的值中删除一个单词 years
:
Duration = map(lambda x: float(x.rstrip('years')), df['Duration'])
它给我这个错误:
AttributeError: 'float' object has no attribute 'rstrip'
如果我在 MS Excel 中打开文件并删除第一行(网络链接)和最后两行(注释),那么代码就可以工作了!
那么,如何在 Python 中自动清理此 CSV 文件(以仅提取具有值的列)?
更新:
当我编写 print df.head()
时,它输出:
have mixed types. Specify dtype option on import or set low_memory=False.
我是否需要为所有 100 列指定类型?如果我不知道先验类型怎么办。
更新: 我无法附加文件,但作为示例,您可以检查 this one . 下载文件 2015-2016。
最佳答案
您应该使用 pd.read_csv() 中的一些参数:
df = pdread_csv('myfile.csv', skiprows=1, skip_footer=2)
我查看了您在评论中提供的链接并尝试导入它。我看到了两种混合数据类型(id
和 desc
),所以我明确地为这两列设置了 dtype。此外,通过观察,页脚包含“总计”,因此我排除了以字母 T
开头的任何行。除标题外,有效行应以 id
列的整数开头。如果引入了其他不以 T
开头的页脚,这将在读取时抛出错误。
如果您先下载并解压zip
文件,您可以进行如下操作:
file_loc = ... # Specify location where you saved the unzipped file.
df = pd.read_csv(file_loc, skiprows=1, skip_blank_lines=True,
dtype={'id': int, 'desc': str}, comment='T')
这将从 emp_length
列中删除 year
或 years
,尽管您仍然保留文本类别。
df['emp_length'] = df.emp_length.str.replace(r'( years|year)', '')
关于python - 如何从 CSV 文件中删除一些带有注释的行以将数据加载到 DataFrame?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32677603/