【问题标题】:'usecols' not working while writing to csv'usecols' 在写入 csv 时不起作用
【发布时间】:2016-07-28 22:33:16
【问题描述】:

我有两个 csv 文件 File1 和 File2。我基本上是在修改 File2 以匹配 File1 中的列。在最后一步中,我需要将修改后的 File2 截断为只有前 50 列。我写了这个程序。

import pandas as pd
df1 = pd.read_csv('C:/Users/merged_34_final_ordered.csv', dtype = 'unicode')
df2 = pd.read_csv('C:/Users/merged_52_raw_ip_2016_06_30.csv', dtype = 'unicode')
df3 = df2.T.reindex(df1.columns).T
df3['idSite'] = pd.Series([52 for x in range(len(df3.index))], index=df3.index)
df3.to_csv('C:/Users/merged_52_raw_ip_2016_06_30_reordered.csv',usecols = list(range(50)),index=False)

这似乎不起作用,因为它不会截断文件。只有在 read_csv 期间添加它才有效。

【问题讨论】:

    标签: python-2.7 csv pandas


    【解决方案1】:

    DataFrame.to_csv() 的正确参数是 columns,而不是 usecols — 后者是 pd.read_csv()。但是,正如@ptrj 指出的那样,to_csv() 期望列名。您可以选择前 50 列并在它们上调用to_csv()

    df.iloc[:,:50].to_csv(filename, index=False)
    

    或使用@ptrj 的方法获取前50 列的名称。

    【讨论】:

    • 显然我猜这并不需要索引。因为我收到了错误KeyError: 'None of [[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]] are in the [columns]'
    • 在 Python 2 中,range(50) 已经是一个列表,所以list(range(50)) 是一个包含 50 个元素的列表。使用columns=range(50)) 而不是columns=list(range(50)))
    【解决方案2】:

    您的一些代码可以简化:

    df1 = pd.read_csv(...)
    df2 = pd.read_csv(...)
    
    df3 = df2.reindex(columns=df1.columns)
    df3['idSite'] = 52
    
    # names of the first 50 cols:
    cols = df3.columns[:50]
    df3.to_csv('filename', columns=cols, index=False)
    

    您收到错误是因为 to_csv 需要列名。

    【讨论】:

      猜你喜欢
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      相关资源
      最近更新 更多