小言_互联网的博客

上手Pandas,带你玩转数据(3)-- pandas数据存入文件

297人阅读  评论(0)

接上一篇

略微有点尴尬,本来存取是应该一起写的,但是没想到一个取居然写了那么多,我都写累了,你们看的不得累嘛,还是分开写,减缓我的疲劳,也减缓你们的视觉疲劳。

上手Pandas,带你玩转数据(2)-- 使用pandas从多种文件中读取数据


将外部数据转化为DataFrame

不管你要写什么,不管你的目的地是什么,首先先将你的数据转化为DataFrame格式的,这点毋庸置疑。
我之前有讲过这个,不过再讲一遍也无妨,因为我自己也记不住。

从列表中创建一个DataFrame:

data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])	


	  Name      Age
0     Alex      10
1     Bob       12
2     Clarke    13

从ndarrays / Lists的Dict创建一个DataFrame:

data = {
   'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':[28,34,29,42]}
df = pd.DataFrame(data)


	  Age      Name
0     28        Tom
1     34       Jack
2     29      Steve
3     42      Ricky


df = pd.DataFrame(data, index=['rank1','rank2','rank3','rank4'])

		 Age    Name
rank1    28      Tom
rank2    34     Jack
rank3    29    Steve
rank4    42    Ricky

从字典列表中创建一个DataFrame:

data = [{
   'a': 1, 'b': 2},{
   'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)

	a    b      c
0   1    2    NaN
1   5   10   20.0


df = pd.DataFrame(data, index=['first', 'second'])

		a   b       c
first   1   2     NaN
second  5   10   20.0

如果不想带上不必要的麻烦,建议把列名带上,然后写入的时候选取不写入索引列


DataFrame写入文件

csv

to_csv()是DataFrame类的方法,常用参数释义如下:

path_or_buf:文件保存位置
sep:分隔符,如果不写,默认是‘,’
columns:指定保存的列
header:是否保存列名称
index:是否保存索引列
index_label:指定索引列名称

代码示例:

import pandas as pd

df = pd.DataFrame([['武汉晴川学院', '市场营销', '物理或历史均可', '不提再选科目要求'],['杭州师范大学钱江学院', '市场营销', '物理或历史均可', '不提再选科目要求'],['云南师范大学商学院', '国际经济与贸易', '物理或历史均可', '不提再选科目要求'],['南昌工学院', '产品设计', '物理或历史均可', '不提再选科目要求'],['长春财经学院', '金融学', '物理或历史均可', '不提再选科目要求'],['广西大学行健文理学院', '金融学', '物理或历史均可', '不提再选科目要求']],
                  columns=["学校","专业","主科要求","副科要求"])
df.to_csv('test.csv',index=False)

如果还有什么其他的要求,请参照上面的参数列表;如果上面的参数列表无法满足你的需求,请在下面评论,然后自己去百度。我看到之后会在第一时间百度然后把缺失补上,谢谢、


追加写入

df.to_csv(file_name, mode='a')

往指定位置写入

你在想什么??用Excel去


json

我觉得啊,以后使用这个函数的可能性也不大。

是吧,咱也不是什么知识都要牢记,要有的放矢。


Excel

Excel,我很喜欢用。但是今天,我产生了新的思考:将数据存起来不是最终目的,我们要达到的应该是根据实际场景选择最佳的存储方式。

而目前我能想到的方式有几种:
1、数据量不大,追求存储的速度。事后可以将缓存好的数据进行一波搬运即可。
2、数据量很大,那不用说了,数据库。
3、数据要进行分表。其实我有点纳闷儿,csv是不支持分表吗?那我如果多写几个csv呢?好像这样也不好,这种时候还是Excel来吧。
毕竟Excel有专业的分表工具,在内存中也只要走一个来回就好。

好了,不废话了,回主题:

def to_excel(excel_writer: Any,
             sheet_name: str = "Sheet1",
             columns: Any = None,
             header: Any = True,
             index: Any = True,
             index_label: Any = None,
             encoding: Any = None,
)

这些个参数不用我再释义了吧,这两篇前前后后都是这些参数。


不覆盖写入

但是呢,还有一个很严重的问题,就是追加写入的问题,是吧,在上面的参数里面其实是没有看到的,包括前面的csv,也没有提到啊。
我做完测试了一下,两次往同一个Excel页中写入,会造成覆盖。

这里要隆重介绍两个参数:

startrow: Any = 0,	# 从哪一行开始写
startcol: Any = 0,	# 从哪一列开始写

这俩参数是Excel的。


这就完了吗?那如果给你一个Excel,里面本来就已经有内容了,但是你并不知道内容有多少啊,那怎么办?

追加写入

我呀,查了老半天资料了,就查出来这么个结果:
1、你先读出来,然后如果要往底部追加,就算一下行数,要往右侧追加,就算一下列数。然后用上面的不覆盖写入的参数来办。
2、换个页写,干嘛要和以前原有的数据掺一块儿呢?

对于方法一:
注意,写入时需设置不包含列序号,行序号,即header=False,index=False

import pandas as pd
from openpyxl import load_workbook

result2=[('a','2','ss'),('b','2','33'),('c','4','bbb')]#需要新写入的数据

df = pd.DataFrame(result2,columns=['xuhao','id','name'])#列表数据转为数据框
df1 = pd.DataFrame(pd.read_excel('123.xlsx',sheet_name='aa')) #读取原数据文件和表

writer = pd.ExcelWriter('123.xlsx',engine='openpyxl')
book=load_workbook('123.xlsx')
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

df_rows = df1.shape[0] #获取原数据的行数
df.to_excel(writer, sheet_name='aa',startrow=df_rows+1, index=False, header=False)#将数据写入excel中的aa表,从第一个空行开始写

writer.save()#保存
writer.close()

如果是想在同一sheet换列追加数据,只需改一下2个参数即可。

df_cols = df1.shape[1]
staion.to_excel(writer, sheet_name=sheet_name, startcol=df_cols, index=False, header=False)

申明:我个人很不喜欢这个方法,但是不介意有朋友会喜欢这个方法。


对pandas操作Excel和csv的感触

花了一晚上,我决定了,专业的工作还是交给专业的工具来办吧,openpyxl不香吗?
是不会吗?我有教程啊!!!

Python之Excel 优雅操作手法 精选


往多个表中写入数据

这里需要使用到ExcelWriter

df = pd.read_csv(csv_file,parse_dates=['data'])

with pd.ExcelWriter('test4.xlsx') as f:
    df.to_excel(f,sheet_name='a',columns=['a'],index=True,index_label='ID')
    df.to_excel(f, sheet_name='b', columns=['b','data'], index=True, index_label='ID')

MySQL

这个还是用pandas吧,虽然也有专业的工具来适用,不过我还没专门写个教程。

保存数据到MySQL

def to_sql(
        self,
        name,
        con,
        schema=None,
        if_exists="fail",
        index=True,
        index_label=None,
        chunksize=None,
        dtype=None,
        method=None,
    )

参数释义:(释义过的参数不再赘述)

schema:用于创建数据库对象,基本上都是使用默认值。

if_exists:如果表存在怎么办?

fail:抛出ValueError异常
replace:在插入数据之前删除表。注意不是仅删除数据,是删除原来的表,重新建表哦。
append:插入新数据。如果有主键,要避免主键冲突;看清表的格式,DataFrame的columns与表的columns是对应的;DF的index默认是作为一列数据的,也就是说默认会写入数据库的

index:将索引作为一列写入数据库,默认为True,也就是说默认DF的索引是要写入数据库的,index_label为列名

index_label:将索引写入数据库时的列名,默认为index;如果DF是多级索引,则index_label应为一个序列

chunksize:批处理,每次处理多少条数据。默认全部,一般没啥用,除非数据量太大,明显感觉卡的时候可以分批处理。

dtype:一个字典,指定列的数据类型。键是列的名字,值是sqlalchemy types或者sqlite3的字符串形式。如果是新建表,则需要指定类型,不然会以存储量最大类型作为默认类型。比如varchar类型就会成为text类型,空间资源浪费很多。如果是添加数据,则一般不需要规定该参数。

method:哪种类型的插入语句?

None:默认单行插入
‘multi’:多行插入
callable:以回调函数插入,写函数的名字,没用过。

最后总结

我怎么越写越觉得不对啊,是不是本末倒置了。
pandas是用来存数据的???

总觉得哪里怪怪的,绝对是本末倒置了!!!
下一篇就拉回正轨。


转载:https://blog.csdn.net/qq_43762191/article/details/115468725
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场