接上一篇
略微有点尴尬,本来存取是应该一起写的,但是没想到一个取居然写了那么多,我都写累了,你们看的不得累嘛,还是分开写,减缓我的疲劳,也减缓你们的视觉疲劳。
上手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不香吗?
是不会吗?我有教程啊!!!
往多个表中写入数据
这里需要使用到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