pandas与MySQL连接和储存
MySQL连接——pymysql
import pandas as pd
import pymysql
pymysql.install_as_MySQLdb()
from sqlalchemy import create_engine
engine = create_engine('dialect+driver://username:password@host:port/database')
df=pd.read_sql("select * from xxx",con=engine)
dialect -- 数据库类型
driver -- 数据库驱动选择
username -- 数据库用户名
password -- 用户密码
host 服务器地址
port 端口
database 数据库
MySQL储存
engine = create_engine('dialect+driver://username:password@host:port/database')
df.to_sql('表名', con=engine, index= ,if_exists = ' ')
name: 输出的表名
con: 与read_sql中相同,数据库链接
if_exits: 三个模式:fail,若表存在,则不输出;replace:若表存在,覆盖原来表里的数据;append:若表存在,将数据写到原表的后面。默认为fail
index:是否将df的index单独写到一列中,False或True,默认为False
时间数据datetime与str的转换
时间数据格式之间的相互转换:
from datetime import datetime
(1)datetime.datetime 转str:
b = datetime.now().strftime('%Y-%m-%d')
(2)str 转datetime.datetime
d = datetime.strptime(b, '%Y-%m-%d') # strptime()内参数必须为string格式
(3)str 转 datetime.date
先将str转datetime,再转datetime.date
e = datetime.date(d) # date()内参数需要datetime.datetime型
(4)datetime.date转str
h = str(e)
环比的计算
diff函数
函数原型:
DataFrame.diff(periods=1, axis=0)
效果等于:
df-df.shift()
参数:
periods:移动的幅度,int类型,默认值为1。
axis:移动的方向,{0 or ‘index’, 1 or ‘columns’},如果为0或者’index’,则上下移动,如果为1或者’columns’,则左右移动。
diff()应用:
第一种:
overall_sales_performance['sum_amount_diff']=(overall_sales_performance.sum_amount.diff()/overall_sales_performance.sum_amount.shift()).fillna(0)
第二种:
#求每月自行车销售订单量环比,观察最近一年数据变化趋势
#环比是本月与上月的对比,例如本期2019-02月销售额与上一期2019-01月销售额做对比
order_num_diff = list((overall_sales_performance.order_num.diff()/overall_sales_performance.order_num.shift()))
order_num_diff.pop(0) #删除列表中第一个元素
order_num_diff.insert(0,0) #将0新增到列表末尾
overall_sales_performance = pd.concat([overall_sales_performance,pd.DataFrame(order_num_diff)])
pct.change()函数
DataFrame.列名.pct_change(periods=1, fill_method=‘pad’, limit=None, freq=None, **kwargs)
表示当前元素与先前元素的相差百分比,当然指定periods=n,表示当前元素与先前n 个元素的相差百分比。
pandas取消科学计数法
pd.set_option('display.float_format', lambda x: '%.3f' % x)
sort_values, DataFrame排序:
df.sort_values(by= , axis= , ascending= , inplace=)
#axis=0表示对行操作,axis=1表示对列进行操作;ascending=True表示升序,ascending=False表示降序;inplace=True表示对原始DataFrame本身操作,因此不需要赋值操作,inplace=False相当于是对原始DataFrame的拷贝,之后的一些操作都是针对这个拷贝文件进行操作的,因此需要我们赋值给一个变量,保存操作后的结果。
list排序
list.sort(cmp=None, key=None, reverse=False)
参数
cmp -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序, reverse = False 升序(默认)。
# 获取列表的第二个元素
def takeSecond(elem):
return elem[1]
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
random.sort(key=takeSecond)
print(random)
以上实例输出结果如下:
排序列表:[(4, 1), (2, 2), (1, 3), (3, 4)]
dataframe去重,将某列元素提取到列表中
df.drop_duplicates(['列名'])
此种去重方法,会让元素按照dataframe的顺序填充到列表中
list(gather_customer_order_10_11_group.drop_duplicates(['chinese_territory']).chinese_territory)
df.列名.unique()
此种方法去重后,元素并未按照dataframe顺序填充到列表中,之后操作,需要注意。必要时候采用sort_index()
list(gather_customer_order_10_11_group['chinese_territory'].unique())
agg的用法和使用范围
用法
DataFrame.agg(func,axis = 0,* args,** kwargs )
func : 函数,函数名称,函数列表,字典{‘行名/列名’,‘函数名’}
使用范围:
1.agg与dataframe一同使用,对一列或一行进行聚合计算
2.agg与groupby一同使用,对groupby之后的一行或一列进行聚合计算,此方法使用更为广泛。
loc、iloc、at、iat的区别
1、 loc和iloc函数都是用来选择某行的,iloc与loc的不同是:iloc是按照行索引所在的位置来选取数据,参数只能是整数。而loc是按照索引名称来选取数据,参数类型依索引类型而定;
2、 at和iat函数是只能选择某个位置的值,iat是按照行索引和列索引的位置来选取数据的。而at是按照行索引和列索引来选取数据;
3、 loc和iloc函数的功能包含at和iat函数的功能。