【问题标题】:Delete Error rows and columns with wrong dtype at same time同时删除具有错误 dtype 的错误行和列
【发布时间】:2017-06-16 19:32:18
【问题描述】:

我有一个包含 16 列和大约 10 亿行的大型数据集。

在这个数据集中我面临两个主要问题

  1. 我有错误行,因为某些行的列数是 more or less 多于 16 列

我正在使用error_rows=False这是跳过行,但我正在执行大约 30 次操作,每次都花费太多时间。

  1. 其中一列是DateTime,采用人类可读的格式。在执行将人类可读转换为Unix 格式的操作之一时。 dtype 不可读主要是因为 error_rows

这给了我关于 dtype 或插入 low_memory=False 的错误和警告

如果我插入dtype,则下一个错误和警告将转移到另一列。

代码:

 for i in input_files:
        Tmp_Table = pd.DataFrame()
        address = direc + i
        df = pd.read_csv(address,sep=',',error_bad_lines=False)

3 列中的 16 列是 datetime 并且似乎列混合了 dtype 可能是由于错误行。为了避免我使用了low_memory=False,这也给了我以下错误

Traceback (most recent call last):
  File "FirstTable.py", line 20, in <module>
    Tmp_Table['Datetime'] = df['Tweeted Datetime'].apply(lambda x: UnixFormat(str(x)))
  File "/usr/local/lib/python2.7/dist-packages/pandas/core/series.py", line 2355, in apply
    mapped = lib.map_infer(values, f, convert=convert_dtype)
  File "pandas/_libs/src/inference.pyx", line 1569, in pandas._libs.lib.map_infer (pandas/_libs/lib.c:66440)
  File "FirstTable.py", line 20, in <lambda>
    Tmp_Table['Datetime'] = df['Tweeted Datetime'].apply(lambda x: UnixFormat(str(x)))
  File "/home/lakshmi/Desktop/Twitter_Code_Ubuntu/Functions.py", line 41, in UnixFormat
    unixtime = previous
UnboundLocalError: local variable 'previous' referenced before assignment

因此,我试图找到一种简单快捷的方法来从数据集中一次性删除这些错误行,这样我的下一个操作就不会占用太多时间。

任何人都可以建议我这样做的最佳方法..提前致谢。

【问题讨论】:

    标签: python pandas datetime memory dataframe


    【解决方案1】:

    正如您所说的有关 Unix 格式的内容,我假设您使用的是 unix 系统。 如果是这样,您可以使用awk 来预处理您的数据。

    如果你的分隔符是制表符:

    awk 'NF==16{print}{}' data > data_edit
    

    如果您的分隔符是逗号:

    awk -F',' 'NF==16{print}{}' data > data_edit
    

    awk 会检查列数,并且只会过滤掉等于 16 的列。之后,只需将这些存储到 data_edit 中

    现在您应该得到一个包含 16 列的数据集,希望这能解决您的大部分问题。

    如果要检查文件中的列数:

    awk -F',' '{print NF}' data | sort | uniq -c
    

    这将打印出两列:出现次数 - 列数

    【讨论】:

    • 是的,我想我只是在寻找类似的东西。这是一个 csv 文件,所以我可以传递 csv 文件名来代替数据吗?并为 data_edit 输入输出 csv 文件名?
    • 是的,正确! awk 可以处理所有纯文本文件。需要明确的是:我知道您使用 pandas 标签发布了此内容,但我在 DataFrames 和更改列数方面的经验并没有那么富有成效,这就是我建议您使用此解决方案的原因。
    • 我对各种解决方案持开放态度。我使用 pandas 来设置标题以备不时之需
    • 问题可能已经解决,但问题是我丢失了大量行,文件大小从 1gb 减少到 80mb,但事实并非如此。
    • @SitzBlogz 检查此链接以了解 Windows 上的 awk:stackoverflow.com/questions/21927944/…
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多