【问题标题】:Questions about read_csv and str dtype关于 read_csv 和 str dtype 的问题
【发布时间】:2016-08-05 04:04:50
【问题描述】:

我有一个大文本文件,其中的列格式如下:

1255 32627 some random stuff which might have numbers 1245

1.我想用read_csv 给我一个三列的数据框。前两列应该是 dtype uint32,第三列只是后面的所有内容都在一个字符串中。也就是上面那行应该分成125532627some random stuff which might have numbers 1245。例如,这不会这样做,但至少显示了 dtypes:

    pd.read_csv("foo.txt", sep=' ', header=None, dtype={0:np.uint32, 1:np.uint32, 2:np.str})

2.我的第二个问题是关于str dtype。它使用多少内存,如果我知道字符串的最大长度,我可以减少它吗?

【问题讨论】:

    标签: python pandas


    【解决方案1】:
    1. 您是否有理由需要使用pd.read_csv()?下面的代码很简单,可以根据您的要求轻松修改列值。

      from numpy import uint32
      from csv import reader
      from pandas import DataFrame
      
      file = 'path/to/file.csv'
      with open(file, 'r') as f:
          r = reader(f)
          for row in r:
              column_1 = uint32(row[0])
              column_2 = uint32(row[1])
              column_3 = ' '.join([str(col) for col in row[2::]])
      
          data = [column_1, column_2, column_3]
          frame = DataFrame(data)
      
    2. 我不明白这个问题。您希望您的琴弦非常长吗? 32 位 Python 安装仅限于 2-3GB 长的字符串。 64 位安装要大得多很多,仅受您可以装入系统的 RAM 数量的限制。

    【讨论】:

    • 谢谢。不抱歉,我的意思是字符串可能很短(例如 2 个字符),并且一个对象使用很多字节。
    【解决方案2】:

    您可以使用 Series.str.cat 方法,该方法的文档可在 here 获得:

    df = pd.read_csv("foo.txt", sep=' ', header=None)
    
    # Create a new column which concatenates all columns
    df['new'] = df.apply(lambda row: row.iloc[2:].apply(str).str.cat(sep = ' '),axis=1)
    df = df[[0,1,'new']]
    

    不确定你的第二个问题是什么意思,但如果你想检查内存中字符串的大小,你可以使用

    import sys
    print (sys.getsizeof('some string'))
    

    抱歉,我不知道知道最大长度将如何帮助您节省内存以及这是否可能

    【讨论】:

    • 这会分别读取所有列,然后将它们合并。我希望你能避免那样做。
    • 问题是 np.str 似乎是一个对象。
    • 据我所知,read_csv 中没有直接的方法可以直接实现你想要的。
    猜你喜欢
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    相关资源
    最近更新 更多