1、针对更为复杂的CSV文件(含有标题和多列)做简单的处理和过滤

“CSV测试数据.csv”文件里的内容:

1435484-20200401195120846-247927549.png

代码,对“花费”进行了去除“$”和类型转换,使用loc函数将满足性别是“女”或花费大于750的行取出,最后写入文件“CSV测试数据copy.csv”:

#!/usr/bin/env python3#读取文本文件

importpandas as pd

input_file = "F://python入门//数据//CSV测试数据.csv"output_file = "F://python入门//数据//CSV测试数据copy.csv"f =open(input_file)

#当我们处理的CSV文件名带有中文时,如果没有open,直接read_csv就会报错。#报错信息:OSError: Initializing from file failed

#将文件内容存放到data_frame中

data_frame =pd.read_csv(f)

#对“花费”进行了去除“$”和类型转换

data_frame['花费'] = data_frame['花费'].str.strip('$').astype(float)

#使用loc函数将满足性别是“女”或花费大于750的行取出

data_frame_value_meets_condition = data_frame.loc[(data_frame['性别'].str.contains('女'))|\

(data_frame['花费'] > 750.0),:]

#loc函数里面的“|”是或的意思,满足条件a或条件b#print(data_frame_value_meets_condition)

#写入文件“CSV测试数据copy.csv”

data_frame_value_meets_condition.to_csv(output_file,index=False,encoding='gb2312')

#如果没有encoding='gb2312',会出现写入乱码

“CSV测试数据copy.csv”里的结果内容:

1435484-20200401200019304-492906898.png

2、针对更为复杂的CSV文件(含有标题和多列),当行中的值属于某个集合时,则保留输出这些行。

源数据:

1435484-20200401202348836-1624263837.png

当行中的值属于某个集合时,则保留输出这些行:

#!/usr/bin/env python3#读取文本文件

importpandas as pd

input_file= "F://python入门//数据//CSV测试数据.csv"output_file= "F://python入门//数据//CSV测试数据copy.csv"f=open(input_file)#当我们处理的CSV文件名带有中文时,如果没有open,直接read_csv就会报错。#报错信息:OSError: Initializing from file failed

data_frame =pd.read_csv(f)#将目标集合放到变量important_datas中

important_datas = ['18256785181','13698762112']#将符合条件的目标数据集取出

data_frame_value_in_set = data_frame.loc[(data_frame['电话号码'].isin(important_datas)),:]#将目标数据集导入“CSV测试数据copy.csv”中

data_frame_value_in_set.to_csv(output_file,index=False,encoding='gb2312')#如果没有encoding='gb2312',会出现写入乱码

结果:

1435484-20200401202434488-327446283.png

3、针对更为复杂的CSV文件(含有标题和多列),筛选出匹配某个模式的行

源数据:

1435484-20200401211027832-1933728486.png

正则表达式的应用(代码):

#!/usr/bin/env python3#读取文本文件

importpandas as pd

input_file= "F://python入门//数据//CSV测试数据.csv"output_file= "F://python入门//数据//CSV测试数据copy.csv"f=open(input_file)#当我们处理的CSV文件名带有中文时,如果没有open,直接read_csv就会报错。#报错信息:OSError: Initializing from file failed

data_frame =pd.read_csv(f)#将符合条件的目标数据集取出

data_frame_value_matches_pattern = data_frame.loc[data_frame['姓名'].str.startswith("王"),:]#将目标数据集导入“CSV测试数据copy.csv”中

data_frame_value_matches_pattern.to_csv(output_file,index=False,encoding='gb2312')#如果没有encoding='gb2312',会出现写入乱码

结果:

1435484-20200401211209787-305246920.png

4、针对更为复杂的CSV文件(含有标题和多列),根据索引值选取列

源文件:

1435484-20200401211912216-1336024353.png

将索引值为0和3的列打印到屏幕,使用iloc函数来根据索引位置选取列。

#!/usr/bin/env python3#读取文本文件

importpandas as pd

input_file= "F://python入门//数据//CSV测试数据.csv"output_file= "F://python入门//数据//CSV测试数据copy.csv"f=open(input_file)#当我们处理的CSV文件名带有中文时,如果没有open,直接read_csv就会报错。#报错信息:OSError: Initializing from file failed

data_frame =pd.read_csv(f)#将符合条件的目标数据集取出

data_frame_column_by_index = data_frame.iloc[:,[0,3]]#将目标数据集导入“CSV测试数据copy.csv”中

data_frame_column_by_index.to_csv(output_file,index=False,encoding='gb2312')#如果没有encoding='gb2312',会出现写入乱码

结果集:

1435484-20200401211957587-1669644082.png

5、针对更为复杂的CSV文件(含有标题和多列),根据列标题选取列

源数据:

1435484-20200401212444829-287916328.png

根据列标题选取列,使用loc函数选取列,代码:

#!/usr/bin/env python3#读取文本文件

importpandas as pd

input_file= "F://python入门//数据//CSV测试数据.csv"output_file= "F://python入门//数据//CSV测试数据copy.csv"f=open(input_file)#当我们处理的CSV文件名带有中文时,如果没有open,直接read_csv就会报错。#报错信息:OSError: Initializing from file failed

data_frame =pd.read_csv(f)#将符合条件的目标数据集取出

data_frame_column_by_name = data_frame.loc[:,['姓名','年龄']]#将目标数据集导入“CSV测试数据copy.csv”中

data_frame_column_by_name.to_csv(output_file,index=False,encoding='gb2312')#如果没有encoding='gb2312',会出现写入乱码

结果集:

1435484-20200401212642472-739464588.png

6、针对更为复杂的CSV文件(含有标题和多列),选取连续的行,去除不需要的行

源数据:

1435484-20200401214042554-825779993.png

去除不需要的行,剩下的行重新生成索引:

#!/usr/bin/env python3#读取文本文件

importpandas as pd

input_file = "F://python入门//数据//CSV测试数据.csv"output_file = "F://python入门//数据//CSV测试数据copy.csv"f =open(input_file)

#当我们处理的CSV文件名带有中文时,如果没有open,直接read_csv就会报错。#报错信息:OSError: Initializing from file failed#无标题行

data_frame = pd.read_csv(f,header=None)

#将不需要的行删掉,开头三行和结尾三行

data_frame = data_frame.drop([0,1,2,9,10,11])

#使用iloc函数选取第一行单独作为列索引,

data_frame.columns =data_frame.iloc[0]

print(data_frame.columns)

#删除第一行(标题行),为数据框重新生成索引

data_frame = data_frame.reindex(data_frame.index.drop(3))

print('……')

print(data_frame)

#将目标数据集导入“CSV测试数据copy.csv”中

data_frame.to_csv(output_file,index=False,encoding='gb2312')

#如果没有encoding='gb2312',会出现写入乱码

结果数据:

1435484-20200401214323342-564757529.png

Spyder右下角打印出来的数据:

Index(['姓名', '性别', '年龄', '总得分', '电话号码', '花费'], dtype='object', name=3)

……3姓名 性别 年龄 总得分 电话号码 花费4 李刚 男 32 567 18512349553 $500.00

5 王红 女 54 423 18256785181 $750.00

6 孙晓 女 25 457 13698762112 $250.00

7 郭亮 男 65 350 18654320816 $125.00

8 高英 女 15 390 18511113141 $815.00

7、针对更为复杂的CSV文件(含有标题和多列),添加标题行

源数据:

1435484-20200402113225249-1022649550.png

添加新标题行:

#!/usr/bin/env python3#读取文本文件

importpandas as pd

input_file= "F://python入门//数据//CSV测试数据.csv"output_file= "F://python入门//数据//CSV测试数据copy.csv"f=open(input_file)#当我们处理的CSV文件名带有中文时,如果没有open,直接read_csv就会报错。#报错信息:OSError: Initializing from file failed#设置标题行

header_list = ['姓名','性别','年龄','总得分','电话号码','花费']#原始无标题行,添加新标题行

data_frame = pd.read_csv(f,header=None,names=header_list)#将目标数据集导入“CSV测试数据copy.csv”中

data_frame.to_csv(output_file,index=False,encoding='gb2312')#如果没有encoding='gb2312',会出现写入乱码

结果:

1435484-20200403194910286-20145423.png

8、针对更为复杂的CSV文件(含有标题和多列),从多个文件中连接数据

数据源是三个CSV文件:

1435484-20200403204229185-49591139.png

为了方便,这里每个CSV文件的内容都相同,以其中一个CSV文件为例:

1435484-20200403204326458-2030315412.png

将这三个内容相同的CSV文件合并:

#!/usr/bin/env python3#读取文本文件

importpandas as pdimportglobimportos#输入文件路径

input_path = "F://python入门//数据"output_file= "F://python入门//数据//CSV测试数据copy.csv"

#将以开头为“CSV测试数据copy”的文件放到all_files中

all_files = glob.glob(os.path.join(input_path,'CSV测试数据copy*'))#将三个目标文件的内容都放到列表all_data_frames中

all_data_frames =[]for file inall_files:#打开每个文件

f =open(file)#读取每个文件,重新设置一列成为index值

data_frame = pd.read_csv(f,index_col =None)

all_data_frames.append(data_frame)#这里,如果你需要平行连接数据,就设置axis=1,指连接后再重新赋值index(len(index))

data_frame_concat = pd.concat(all_data_frames,axis=0,ignore_index=True)#将目标数据集导入“CSV测试数据copy.csv”中

data_frame_concat.to_csv(output_file,index=False,encoding='gb2312')#如果没有encoding='gb2312',会出现写入乱码

结果为生成文件“CSV测试数据copy.csv”,其内容为:

1435484-20200403204506579-1127105186.png

9、针对更为复杂的CSV文件(含有标题和多列),计算每个文件中值的总和和均值

源数据为四个文件夹,三个相同内容的文件,一个是前三个文件的汇总:

1435484-20200403231841024-2050978222.png

这三个文件与(8)中的例子一样,这里不再赘述。

另一个汇总的文件:

1435484-20200403231947875-1442145650.png

其内容为前三个文件内容的加总:

1435484-20200403232020643-1206054953.png

对这三个文件取中的花费字段取总和和均值:

#!/usr/bin/env python3#读取文本文件

importpandas as pdimportglobimportos#输入文件路径

input_path = "F://python入门//数据"output_file= "F://python入门//数据//CSV测试数据copy_new.csv"

#将以开头为“CSV测试数据copy”的文件放到all_files中

all_files = glob.glob(os.path.join(input_path,'CSV测试数据copy*'))#将三个目标文件的内容都放到列表all_data_frames中

all_data_frames =[]for input_file inall_files:#打开每个文件

f =open(input_file)#读取每个文件,重新设置一列成为index值

data_frame = pd.read_csv(f,index_col =None)#求花费总和

total_sales = pd.DataFrame([float(str(value).strip('$').replace(',',''))\for value in data_frame.loc[:,'花费']]).sum()print(total_sales)#求花费均值

average_sales = pd.DataFrame([float(str(value).strip('$').replace(',',''))\for value in data_frame.loc[:,'花费']]).mean()print(average_sales)#生成一个字典

data = {'file_name':os.path.basename(input_file),'total_sales':total_sales,'average_sales':average_sales}#将处理的每个文件的总和和均值放到all_data_frames中

all_data_frames.append(pd.DataFrame(data,columns = ['file_name','total_sales',\'average_sales']))#这里,如果你需要平行连接数据,就设置axis=1,指连接后再重新赋值index(len(index))

data_frame_concat = pd.concat(all_data_frames,axis=0,ignore_index=True)#将目标数据集导入“CSV测试数据copy.csv”中

data_frame_concat.to_csv(output_file,index=False,encoding='gb2312')#如果没有encoding='gb2312',会出现写入乱码

生成的“CSV测试数据copy_new.csv”结果:

1435484-20200403232539770-1105515362.png

打印到Spyder右下角的结果:

0 7320.0dtype: float64

0488.0dtype: float64

02440.0dtype: float64

0488.0dtype: float64

02440.0dtype: float64

0488.0dtype: float64

02440.0dtype: float64

0488.0dtype: float64

好了,以上内容是小编整理的python处理CSV文件的代码及运行结果~

1435484-20200403232742880-2073219880.jpg

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐