【问题标题】:reading from big csv file and save rows which meet condition into another df从大 csv 文件中读取并将满足条件的行保存到另一个 df
【发布时间】:2021-10-07 19:35:43
【问题描述】:

我有一个大小为 443,00 KB 的大 csv 文件(数据集)。照片显示了文件的样本。我想将行保存到另一个数据框中。我试过这种方式,但它需要这么多时间e

import pandas as pd
df = pd.DataFrame()
for chunk in pd.read_csv("UsersVle.csv", chunksize=10):
    for i, row in chunk.iterrows():
        if((row['module']=='D3') & (row['presentation']=='13B')):
            df.append(row)

在寻找解决方案时,我发现了一些关于chuncksize的东西并尝试了这种方式,但是出现了错误 TypeError: Cannot perform 'rand_' with a dtyped [object] array and scalar of type [bool]

import itertools as IT

chunksize = 10 ** 3
chunks = pd.read_csv('UsersVle.csv', chunksize=chunksize)
chunks = IT.takewhile(lambda chunk: (chunk['module']=='D3' & chunk['presentation']=='13B'), chunks)
df = pd.concat(chunks) 

我需要一种有效的方法来读取这个大文件并将满足条件的行保存到另一个数据框中。我会感谢你的帮助。 PS,我尝试了 dask,但似乎没有读取文件,因为我使用了 df.head(),没有返回行!

【问题讨论】:

  • 我认为您需要为块大小找到正确的值。通过电影数据集(ratings.csv)尝试时,10 或 1000 对我来说太低了。对我来说最佳值是 10**6。

标签: python-3.x pandas csv memory chunks


【解决方案1】:

不是很科学,但是想出个思路来调整值:

使用moviedataset/rating.csv:

print('Without chunksize')
start = timer()
df = pd.read_csv('ml-latest/ratings.csv')
df2 = df[df["rating"] == 5.0]
print(timer() - start)

for cs in range(4, 10):
    print('Chunk size', cs, 10 ** cs)
    start = timer()
    rdr= pd.read_csv('ml-latest/ratings.csv', chunksize=10**cs)
    df2 = pd.concat([chunk[chunk['rating'] == 5.0] for chunk in rdr])
    print(timer() - start)

输出:

Without chunksize
5.055990324995946
Chunk size 4 10000
8.80516574899957
Chunk size 5 100000
5.21452364900324
Chunk size 6 1000000
4.814042658996186
Chunk size 7 10000000
4.8958623920043465
Chunk size 8 100000000
5.152557591005461
Chunk size 9 1000000000
5.076704847000656

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 1970-01-01
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 2018-07-18
    相关资源
    最近更新 更多