【问题标题】:Speed up this conditional row read of csv file in Pandas?在 Pandas 中加快对 csv 文件的条件行读取?
【发布时间】:2020-10-09 17:18:38
【问题描述】:

我修改了 post 中的一行,以有条件地从 csv 文件中读取行:

filename=r'C:\Users\Nutzer\Desktop\Projects\UK_Traffic_Data\test.csv'

df = (pd.read_csv(filename, error_bad_lines=False) [lambda x: x['Accident_Index'].str.startswith('2005')])

这条线非常适合小型测试数据集。但是,我确实有一个大的 csv 文件要读取,并且读取文件需要很长时间。实际上,最终到达了NotebookApp.iopub_data_rate_limit。我的问题是:

  1. 有没有办法改进此代码及其性能?
  2. “Accident_Index”列中的记录已排序。因此,如果达到“Accident_Index”不等于str.startswith('2005') 的值,则可能是中断读取语句的解决方案。你有什么建议吗?

以下是一些示例数据:

所需的输出应该是包含前六名记录的 pandas 数据框。

【问题讨论】:

    标签: python pandas performance csv


    【解决方案1】:

    我们最初可以在上述条件下仅读取我们想要过滤的特定列(假设这显着减少了读取开销)。

    #reading the mask column
    df_indx = (pd.read_csv(filename, error_bad_lines=False,usecols=['Accident_Index'])
               [lambda x: x['Accident_Index'].str.startswith('2005')])
    

    然后我们可以使用该列中的值通过 skiprowsnrows 属性从文件中读取剩余的列,因为它们是输入文件中的排序值

    df_data= (pd.read_csv(filename,    
             error_bad_lines=False,header=0,skiprows=df_indx.index[0],nrows=df_indx.shape[0]))
    df_data.columns=['Accident_index','data']
    

    这将提供我们想要的数据的一个子集。我们可能不需要单独获取列名。

    【讨论】:

    • 谢谢@Praveen KR,这工作非常顺利!
    猜你喜欢
    • 2021-12-08
    • 2017-01-14
    • 1970-01-01
    • 2015-04-07
    • 2017-02-15
    • 2021-04-16
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多