【python】csv

本文介绍了一种使用Python解析CSV和TSV文件的方法,通过自定义CSV生成器实现数据读取,并利用dask库处理大规模5G数据集,优化内存使用,实现高效的数据分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CSV生成器

from collections import namedtuple
def csv_reader(fd, delimiter='\t'):
    def gen():
        for i in fd:
            yield i.rstrip('\n').split(delimiter)
    return gen()

def read_tsv(input_file, quotechar=None):
    with open(input_file, 'r', encoding='utf8') as f:
        reader = csv_reader(f)
        headers = next(reader)
        Example = namedtuple('Example', headers) # header
        examples = []
        for line in reader:
            example = Example(*line)
            examples.append(example)
        return examples
print(read_tsv("49"))

输入

num	type
16111	definition
20381	digit-money

输出

[Example(num='16111', type='definition'), Example(num='20381', type='digit-money')]

读5G文件

一、读取5G的csv文件没问题,但是内存就用了11G,仍然没办法进行数据分析的操作。

只能读取的话,

import dask.dataframe as dd
import os
from tqdm import tqdm
TRAIN_PATH = '../input/train.csv'
# Set columns to most suitable type to optimize for memory usage
traintypes = {'fare_amount': 'float32',
              'pickup_datetime': 'str', 
              'pickup_longitude': 'float32',
              'pickup_latitude': 'float32',
              'dropoff_longitude': 'float32',
              'dropoff_latitude': 'float32',
              'passenger_count': 'uint8'
             }
cols = list(traintypes.keys())
chunksize = 10_000_000 # 5 million rows at one go. Or try 10 million
%%time
df_list = []
for df_chunk in tqdm(pd.read_csv(TRAIN_PATH, usecols=cols, dtype=traintypes, chunksize=chunksize)):
    df_list.append(df_chunk)
train_df = pd.concat(df_list)

del df_list
train_df.info()
二、dask

据说可以批处理,apply都能用,待尝试

--------------------------------------更新,已尝试
有一个比较致命的缺点,没办法重置索引。
但是我需要重置索引,所以目前失败,或许可以不重置
目前对于四个操作是秒完成的,train_df 包含5 000 000 + 条数据
(只是介绍一下操作,和dataframe很像,代码是无法运行的)

import pandas as pd
import numpy as np
import time
import datetime
import dask.dataframe as dd
train_df = dd.read_csv('../input/train.csv')
# drop
train_df = train_df.drop(['key','pickup_longitude','pickup_latitude','dropoff_longitude','dropoff_latitude'],axis=1)
# apply
train_df['price'] = train_df.apply(lambda x: func(x.distance, x.fare_amount), axis = 1)
# 强转
train_df['week'] = train_df['week'].astype(int)
# 筛选
train_df = train_df[train_df['price'] > 0]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值