【问题标题】:Python Pandas: Write certain rows in filePython Pandas:在文件中写入某些行
【发布时间】:2016-09-21 21:25:42
【问题描述】:

csv 文件太大了,所以我正在逐块读取它。 因此,我将 read_csv 与 chunksize 一起使用。

我想存储所有行,其中最后一个条目的值为 1 在一个文件中,而所有其他行的最后一个条目的值为 0 在另一个文件中。

假设它看起来像这样:

ID   A    B   C
0   0.0  0.1  1
1   0.1  0.2  0
2   0.1  0.0  1

所以,我想将 ID 为 0 和 2 的行存储在一个文件中,将 ID 为 1 的行存储在另一个文件中。

如何使用 pandas 做到这一点?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    来自this 发帖:

    reader = pd.read_csv('big_table.txt', sep='\t', header=0, 
                         index_col=0, usecols=the_columns_i_want_to_use, 
                         chunksize=10000)
    
    df = pd.concat([ chunk.ix[rows_that_I_want_] for chunk in reader ])
    

    而是制作 2 个数据框:

    df0 = pd.concat([ chunk[chunk["C"] == 0] for chunk in reader ])
    df1 = pd.concat([ chunk[chunk["C"] == 1] for chunk in reader ])
    

    然后独立保存每个数据帧

    【讨论】:

    • 但是我逐块阅读它,根据文档我得到一个 TextFileReader 对象而不是数据框
    • 更新了它以考虑块大小。 TextFileReader 对象是一个生成器,因此您需要遍历它。您可以使用列表理解制作一堆较小的数据框,然后将它们连接在一起。
    • 生成器是什么意思?
    • 数据是按需生成的,因此在调用该块时它只占用每个块的内存:python-course.eu/generators.php
    • 刚刚出现了其他问题。如果我将 chunk["C"] == 1 与 if 组合使用 if chunk["C"] == 1 我得到 ValueError: The truth value of a Series is ambiguous。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。你知道如何克服这个问题吗?
    【解决方案2】:

    我会这样做:

    first = True
    df = pd.read_csv('file.csv', chunksize=1e5)
    for chunk in df:
        if first:
            chunk[chunk['C'] == 1].to_csv('ones.csv', header=True)
            chunk[chunk['C'] == 0].to_csv('zero.csv', header=True)
            first = False
        chunk[chunk['C'] == 1].to_csv('ones.csv', header=False)
        chunk[chunk['C'] == 0].to_csv('zero.csv', header=False)
    

    【讨论】:

      猜你喜欢
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 2020-04-29
      相关资源
      最近更新 更多