我是靠谱客的博主 懵懂洋葱,最近开发中收集的这篇文章主要介绍【Python编程】应用系列1-使用pandas实现.csv文件的拆分或者合并【Python编程】应用系列1-使用pandas实现.csv文件的拆分或者合并,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

目录

  • 【Python编程】应用系列1-使用pandas实现.csv文件的拆分或者合并
    • 9.1 什么是Pandas?如何安装?
    • 9.2 使用pandas合并一个文件夹的所有.csv文件
    • 9.3 使用pandas拆分一个.csv文件

【Python编程】应用系列1-使用pandas实现.csv文件的拆分或者合并

我的博客专栏Python编程系列文章。Python环境配置参考《【Python学习】Windows10开始你的Anaconda安装与Python环境管理》或者《【Python学习】纯终端命令开始你的Anaconda安装与Python环境管理》。

作者: 陈艺荣
代码环境: Python3、jupyter notebook

9.1 什么是Pandas?如何安装?

  • Pandas 是 Python 语言的一个扩展程序库,提供高性能、易于使用的数据结构和数据分析工具。

  • Pandas 名字衍生自术语 “panel data”(面板数据)和 “Python data analysis”(Python 数据分析)。

  • Pandas 一个强大的分析结构化数据的工具集,可以从各种文件格式比如 CSV、JSON、SQL、Microsoft Excel 导入数据。

  • Pandas 可以对各种数据进行运算操作,比如归并、再成形、选择,还有数据清洗和数据加工特征。

  • Pandas 广泛应用在学术、金融、统计学等各个数据分析领域。

在conda环境中安装pandas非常简单,只需要使用以下命令即可:
方式1:使用pip安装

pip install pandas

方式2:使用conda安装

conda install pandas

Pandas的数据结构为,DataFrame,一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。而Series则 类似表格中的一个列(column),类似于一维数组,可以保存任何数据类型。我们把一个.csv文件读取进来就是一个DataFrame对象。DataFrame 构造方法如下:

pandas.DataFrame( data, index, columns, dtype, copy)

参数说明:

  • data:一组数据(ndarray、series, map, lists, dict 等类型)。
  • index:索引值,或者可以称为行标签。
  • columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
  • dtype:数据类型。
  • copy:拷贝数据,默认为 False。

DataFrame 是一个二维的数组结构,类似二维数组。

9.2 使用pandas合并一个文件夹的所有.csv文件

例如,在./MELD路径下存在如下三个文件:

dev_sent_emo.csv
test_sent_emo.csv
train_sent_emo.csv

这是知名的对话情感识别数据集MELD的三个文件

假设我想将这三个csv文件合并为一个MELD_total_text.csv文件

  • pd.read_csv:这是pandas最常用的函数,使用该函数可以把csv格式的文件读进来,它的使用格式为:
import pandas as pd
df = pd.read_csv('filename.csv')
  • os.path.isfile:判断文件是否存在

如下为实现该功能的函数,可以直接复制该段代码拿去使用:

import os
import pandas as pd
from os.path import join
def combine_csv_files(re_encode_path, save_name, files, save_in):
    '''combine_csv_files
    将指定路径下的所有csv文件合并为一个csv文件

    使用示例:
    file_names = os.listdir("./MELD/")
    combine_csv_files(re_encode_path="./MELD/", 
                      save_name="MELD_total_text", 
                      files=file_names, 
                      save_in="./MELD/")

    '''
    if os.path.isfile(join(save_in, "%s.csv") % save_name): 
        # 如果已经存在合并后的文件,则直接return 0
        return 0
    else:
        try:
            main_list = []
            for i in range(len(files)):
                content = pd.read_csv(join(re_encode_path, files[i]), encoding="UTF-8-SIG")
                if i == 0:
                    main_list.extend([list(content.keys())])
                main_list.extend(content.values.tolist())

            main_dict = {}
            for i in list(zip(*main_list)):
                main_dict[i[0]] = list(i[1:])
            data_df = pd.DataFrame(main_dict)
            data_df.to_csv(join(save_in, "%s.csv") % save_name, encoding="UTF-8-SIG", index=False)
        except:
            print("合并[%s]时发生错误" % save_name)

使用示例:

if True: # 设置标记是否运行
    file_names = os.listdir("./MELD/") # 文件名列表
    combine_csv_files(re_encode_path="./MELD/", 
                      save_name="MELD_total_text", 
                      files=file_names, 
                      save_in="./MELD/")

9.3 使用pandas拆分一个.csv文件

例如,将一个大的csv文件拆分为训练集、验证集、测试集。

如下为实现该功能的函数,可以直接复制该段代码拿去使用:

import os
import random
import pandas as pd
from os.path import join
def shuffle_total_data(data_path="./MELD/MELD_total_text.csv", 
                       save_path="./MELD/", 
                       index_name="Dialogue_ID",
                       validation_split_percentage=0.1, 
                       test_split_percentage=0.1, 
                       regen=False):
    '''shuffle_total_data
    将一个.csv文件(例如:CPED_total_text.csv)随机打乱,拆分为训练集、验证集、测试集,分别保存
    使用示例:
    shuffle_total_data(data_path="./MELD/MELD_total_text.csv", 
                       save_path="./MELD", 
                       index_name="Dialogue_ID",
                       validation_split_percentage=0.1, 
                       test_split_percentage=0.1, 
                       regen=False)
    
    '''
    if regen==False:
        print("不进行重复生成!")
    else:
        print("Read dataset from ", data_path)
        data = pd.read_csv(data_path, encoding="UTF-8-SIG")
                        
        # 划分为训练集、测试集
        keys = list(set(data[index_name]))
        random.shuffle(keys) # 随机打乱
        validation_split_id = int(len(keys)*(1-validation_split_percentage-test_split_percentage))
        test_split_id = int(len(keys)*(1-test_split_percentage))
        train_keys = keys[:validation_split_id] # 训练集索引
        valid_keys = keys[validation_split_id:test_split_id] # 验证集索引
        test_keys = keys[test_split_id:] # 测试集索引
        train_data = data[data[index_name].isin(train_keys)]
        valid_data = data[data[index_name].isin(valid_keys)]
        test_data = data[data[index_name].isin(test_keys)]
        
        train_data.to_csv(join(save_path,"train_shuffle_split.csv"), encoding="UTF-8-SIG", index=False)
        valid_data.to_csv(join(save_path,"valid_shuffle_split.csv"), encoding="UTF-8-SIG", index=False)
        test_data.to_csv(join(save_path,"test_shuffle_split.csv"), encoding="UTF-8-SIG", index=False)
        print("已经完成数据集生成!")

以上代码实现读取一个csv文件,然后根据指定的索引('Dialogue_ID’列)进行打乱操作,打乱操作使用如下代码实现:

keys = list(set(data['Dialogue_ID']))
random.shuffle(keys) # 随机打乱

使用示例:

shuffle_total_data(data_path="./MELD/MELD_total_text.csv", 
                   save_path="./MELD", 
                   index_name="Dialogue_ID",
                   validation_split_percentage=0.1, 
                   test_split_percentage=0.1, 
                   regen=True)
Read dataset from  ./MELD/MELD_total_text.csv
已经完成数据集生成!

最后

以上就是懵懂洋葱为你收集整理的【Python编程】应用系列1-使用pandas实现.csv文件的拆分或者合并【Python编程】应用系列1-使用pandas实现.csv文件的拆分或者合并的全部内容,希望文章能够帮你解决【Python编程】应用系列1-使用pandas实现.csv文件的拆分或者合并【Python编程】应用系列1-使用pandas实现.csv文件的拆分或者合并所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部