Python使用pandas对CSV进行操作(11种基础操作含源码)

源数据如下:含脏数据(price列)
在这里插入图片描述下列源码用到如下四个包:

import pandas as pd
import glob
import os
import csv

1.基础文件读写(等同于copy文件)

def base_read_and_write():
    input_file = 'csv_python.csv'#sys.argv[1]
    output_file = 'csv_python_write.csv'#sys.argv[2]
    data_frame = pd.read_csv(input_file)
    data_frame.to_csv(output_file,index = False)

2.行中的值满足某个条件(含整理原始文件脏数据)

def write_row_in_col():
    input_file = 'csv_python.csv'
    output_file = 'csv_python_write.csv'
    data_frame = pd.read_csv(input_file)
    data_frame['price'] = data_frame['price'].str.strip('¥').str.replace(',','').astype(float)
    #清洗脏数据,这里有以万为单位的,也有以元为单位的,根据房产实际情况,我们把它们都整理成以万为单位的
    for i,millions_row in data_frame.iterrows():
        '''if (millions_row['price']>10000):
            million = millions_row['price']/10000
        else:
            million = millions_row['price']'''
        million = millions_row['price']/10000 if millions_row['price']>10000 else millions_row['price']#等同于上面的if-else
        data_frame.at[i,'price'] = '{}'.format(million)
    #取出含有'世贸'且房价大于200万的房子
    #[,:],逗号前为行,逗号后为列,:表示所有,如选定列,例如为:df.loc[:,'A']
    data_frame_value_meets_condition = data_frame.loc[(data_frame['name'].str.contains('世茂')) & (data_frame['price']>200),:]
    data_frame_value_meets_condition.to_csv(output_file,index = False)

运行,新文件显示如下:
在这里插入图片描述

3.行中的值满足某个集合

def write_row_in_set():
    input_file = 'csv_python.csv'
    output_file = 'csv_python_write.csv'
    data_frame = pd.read_csv(input_file)
    #取出2室2厅,3室2厅房子
    important_dates = ['2室2厅','3室2厅']
    data_frame_value_in_set = data_frame.loc[data_frame['style'].isin(important_dates),:]
    data_frame_value_in_set.to_csv(output_file,index = False)

运行,新文件显示如下:
在这里插入图片描述

4.行中的值匹配于某个模式

def write_row_in_re():
    input_file = 'csv_python.csv'
    output_file = 'csv_python_write.csv'
    data_frame = pd.read_csv(input_file)
    #取出以'世贸'开头的房子
    data_frame_value_matches_pattern = data_frame.loc[data_frame['name'].str.startswith('世茂'),:]
    data_frame_value_matches_pattern.to_csv(output_file,index = False)

运行,新文件显示如下:
在这里插入图片描述

5.选取特定的列(列索引值)

def write_row_index():
    input_file = 'csv_python.csv'
    output_file = 'csv_python_write.csv'
    data_frame = pd.read_csv(input_file)
    #取0,2,3,4列
    data_frame_column_by_index = data_frame.iloc[:,[0,2,3,4]]
    data_frame_column_by_index.to_csv(output_file,index = False)

6.选取特定的列(列标题)

def write_row_colname():
    input_file = 'csv_python.csv'
    output_file = 'csv_python_write.csv'
    data_frame = pd.read_csv(input_file)
    #取name,style,size,price列
    data_frame_column_by_name = data_frame.loc[:,['name','style','size','price']]
    data_frame_column_by_name.to_csv(output_file,index = False)

5,6运行,新文件显示相同,如下:
在这里插入图片描述

7.选取连续的行(丢弃不需要的行)

源数据如下:
在这里插入图片描述在这里插入图片描述在源数据的头部和尾部有说明文字,但这并不是我们想要的,我们需要把开头和结尾的说明文字去掉后再写入新文件。

def write_row_selectrows():
    input_file = 'csv_python_1.csv'
    output_file = 'csv_python_write.csv'
    data_frame = pd.read_csv(input_file)
    #丢掉0行和61行
    #data_frame = data_frame.drop([0,61])
    data_frame = data_frame.reindex(data_frame.index.drop([0,61]))#和上面的效果一样,这种方式为数据框架重新生成索引
    data_frame.to_csv(output_file,index = False)

运行,新文件显示如下,开头和结尾的说明被去掉了:
在这里插入图片描述在这里插入图片描述

8.添加标题行

源数据如下:在这里插入图片描述源数据没有标题行,我们需要添加一个标题行:

#添加标题行
def write_row_addnames():
    input_file = 'csv_python_2.csv'
    output_file = 'csv_python_write.csv'
    header_list = ['name','loc','style','size','price','foc']
    data_frame = pd.read_csv(input_file,names=header_list)
    data_frame.to_csv(output_file,index = False)

运行,新文件显示如下,添加了标题行
在这里插入图片描述

9.读取多个csv文件,包含去重

如下图结果,在当前运行.py文件目录同级,有如下文件:
在这里插入图片描述我们要找出以csv_python_3_开头的csv文件,先做一个简单的计数,然后经过去掉重复数据操作后,写入到一个文件里。

def read_multiple_csv():
    #文件计数与文件中的行列计数
    all_files = glob.glob(os.path.join(os.getcwd(),'csv_python_3_*'))
    file_counter = 0
    for input_file_path in all_files:
        row_counter = 1
        with open(input_file_path,'r',newline='') as csv_in_file:
            filereader = csv.reader(csv_in_file)
            header = next(filereader,None)
            for row in filereader:
                row_counter +=1
        print('file:{}\trows:{}\tcols:{}'.format(os.path.basename(input_file_path),row_counter,len(header)))
        file_counter+=1
    print('number of files:{}'.format(file_counter))

    #从多个文件中连接数据
    output_file = 'csv_python_write.csv'
    all_data_frames = []
    for file in all_files:
        data_frame = pd.read_csv(file,index_col=None)
        all_data_frames.append(data_frame)
    data_frame_concat = pd.concat(all_data_frames,axis=0,ignore_index=True)#ignore_index=True 对index重新安排
    #清洗重复数据
    data_frame_concat.drop_duplicates(['name','loc','style','size','price','foc'],inplace=True,ignore_index=True)#本例也可写为data_frame_concat.drop_duplicates(inplace=True,ignore_index=True),即去掉完全重复的行数
    data_frame_concat.to_csv(output_file,index = False)

10.计算每个文件中值的总和与平均值,写入新文件

利用上面的三张表,我们根据表中foc字段(关注数)来计算每张表内总的foc和平均的foc

def read_sum_csv():
    output_file = 'csv_python_total_write.csv'
    all_files = glob.glob(os.path.join(os.getcwd(),'csv_python_3_*'))
    all_data_frames = []
    for input_file in all_files:
        data_frame = pd.read_csv(input_file,index_col=None)
        #计算总关注度
        total_foc = pd.DataFrame(int(str(value).strip()) for value in data_frame.loc[:,'foc']).sum()
        #计算平均关注度
        average_foc = pd.DataFrame(int(str(value).strip()) for value in data_frame.loc[:,'foc']).mean()
        data = {'file_name':os.path.basename(input_file),
                'total_foc':total_foc,
                'average_foc':average_foc}
        all_data_frames.append(pd.DataFrame(data,columns=['file_name','total_foc','average_foc']))
    data_frame_concat = pd.concat(all_data_frames,axis=0,ignore_index=True)
    data_frame_concat.to_csv(output_file,index = False)#将新建这个三个列单独写成一个文件

运行,结果如下:
在这里插入图片描述

11.计算每个文件中值的总和与平均值,写入原文件(这里先复制出一份和原来一样的文件后写入新文件)

这里我们在上一个计算总关注数和平均关注数的基础上,求一个每个楼盘的总关注数,这里用到了groupby这个分组函数。求出来的结果插入到最下行

def read_sum_csv_2():
    all_files = glob.glob(os.path.join(os.getcwd(),'csv_python_3_*'))
    for input_file in all_files:
        output_file = 'csv_python_write_{}'.format(os.path.basename(input_file).split('csv_python_3_')[1])
        print(output_file)
        data_frame = pd.read_csv(input_file,index_col=None)
        #在最下行插入total_foc和average_foc
        total_foc_frame = pd.DataFrame(['关注数总计','','','','',data_frame['foc'].sum()]).T
        total_foc_frame.columns = data_frame.columns
        df_new = pd.concat([data_frame,total_foc_frame],ignore_index=True)
        average_foc_frame = pd.DataFrame(['平均关注数','','','','',data_frame['foc'].mean()]).T
        average_foc_frame.columns = df_new.columns
        df_new = pd.concat([df_new,average_foc_frame],ignore_index=True)
        #计算每个楼盘的总关注度
        community_total_foc = data_frame.groupby('name')['foc'].sum().reset_index(name='community_total_foc')
        #在最下插入community_name和community_total_foc
        community_total_foc_frame = pd.DataFrame(community_total_foc)
        df_new = pd.concat([df_new,community_total_foc_frame],ignore_index=True)
        df_new.to_csv(output_file,index = False)

运行,结果如下:
在这里插入图片描述三个文件,每个文件的格式都如上图所示。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章