Pandas 基础知识2
1 pandas 分组计算
import pandas as pd
import numpy as np
df = pd.DataFrame({
'key1':['a','a','b','b','a'],
'key2':['one','two','one','two','one'],
'data1':np.random.randint(1,10,5),
'data2':np.random.randint(1,10,5)
})
df['data1'].groupby(df['key1']).mean()# df二维数组的data1这一列根据key1分组并求平均值
# 依据多个列表分组
df['data1'].groupby([df['key1'],df['key2']]).sum() # sum求和,.size()求个数
df.groupby('key1').sum()['data1'] # 直接对表进行分组,求和
mean = df.groupby(['key1','key2']).sum()['data1']
mean.unstack() # 将series转换为dataframe数组
# 支持for循环迭代
for name,group in df.groupby('key1'):
print(name)
print(group)
df.groupby(df.dtypes,axis = 1).sum() # 根据列分组 横着分组
# 根据字典分组
df = pd.DataFrame(np.random.randint(1,10,(5,5)),
columns = list('abcde'),
index = ['alice','bob','candy','dark','emily'])
df.iloc[1,1:3] = np.nan
pandas 聚合函数
# pandas 内置聚合函数
# sum()/mean()/max()/min()/describe
# 自定义聚合函数 df.agg(自定义聚合函数名) 自定义函数不需要加''号
# df.agg([‘内置聚合函数1’,‘内置聚合函数2’,(对聚合函数作用后的列重新命名,聚合函数3)])
# 可以利用字典
# d = {'列1':'内置聚合函数1','内置聚合函数2',('聚合函数生成的列重新命名',自定义聚合函数)}
# df.agg(d)
pandas 文件读取
读文件
# 有列名称
# pd.read_csv('文件名')
# pd.read_table('文件名',sep = '分割符')
# 无列名称
# pd.read_csv('文件名',header = None,names = [列名称列表])
# pd.read_csv('文件名',header = None,names = [列名称列表],index_col = [行名称列表1,行名称列表2])
# 以上方法指定多重索引
# 分隔符不规则
# 正则表达式
# pd.read_table('文件名',sep = '正则表达式') \s+
# 缺失值的处理
# pd.read_csv('文件名',na_values = [当成缺失值的列表]) #针对整个数组指定缺失值
# 针对每一列指定缺失值
# pd.readn_csv('文件名',na_values = {'列1':[缺失值列表],'列2':[缺失值列表]})
# 方块读取数据
# pd.read_csv('文件名',nrows = 行数) # 读取数据中固定行数的内容
# tr = pd.read_csv('文件名',chunksize = 行数) 每次读取文件中固定的行数,放在tr变量中
# tr 可以迭代
# result = pd.Series([]) # 创建结果容器
# for chunk in tr: # meiyige chunk 都是一个固定行数的dataframe
# result = result.add(chunk['列名'].values_count(),fill_value = 0)
写文件
# df.to_csv('文件名',index = False) # index = False 不写索引
# df.to_csv('文件名',index = False,header = None,columns = [列名],sep = 分隔符)
# header 不写列索引,columns 指定写入哪些列到磁盘
Pandas数据可视化
import pandas as pd
import numpy as np
#一维 折线图
ts = pd.Series(np.random.randn(1000),index = pd.date_range('20100101',periods = 1000)) # 创建对象
ts = ts.cumsum() # 求累加和
ts.plot(title = 'cumsum',style = 'r-',figsize = (8,6)); # 折线图
# 二维 折线图
df = pd.DataFrame(np.random.randn(1000,4),index = ts.index,columns = list('abcd'))
df = df.cumsum()
df.plot(subplots = True,figsize = (6,8),sharey = True); # subplots 将每个子图单独画出来 sharey 使坐标y一致
# 二维 柱状图
# 柱状图 plot(kind = 'bar') 或者plot.bar(h) 水平(垂直)
df.iloc[0].plot(kind = 'bar')
df.plot.bar(stacked = True) #括号内可以指定参数stacked = True 接力画
# 直方图
df['a'].hist(bins = 20,alpha = 0.3,stacked = True) # 直方图 bins 柱子个数, alpha 指定透明度,stacked 指定接力形式
df.plot.hist(subplots = True,sharex = True,sharey = True,bins = 50);
# 概率密度
df['a'].plot.kde() # 概率密度
# 散布图
df.plot.scatter(x= 'a',y = 'b') # 散布图
# 饼图
s.plot.pie()
pandas时间序列
# python datetime模块
# from datetime import datetime
# from datetime import timedelta
# python 时间
# now = datetime.now 现在的时间
# now.year,now.month,now.day #datetime year month day 属性
# date1 = datetime(2019,12,31)
# date2 = datetime(2020,6,30) # datetime 创建时间
# deltatime = date1 - date2
# deltatime.days # 差的天数
# deltatime.total_seconds() # 差的秒数
# timedelta(4.5)+date1 #date1 + 4.5 天
# date1.strftime('%y/%m%d' %H:%M:%S) # 时间转换为字符串
# datetime.strptime('2019-02-20 9:30','%Y-%m-%d %H:%M') # 字符串转换成时间
# pandas时间序列
# dates = [datetime(2016,3,1),datetime(2016,4,1),datetime(2016,5,1)] #创建时间序列列表
# s = pd.Series(np.random.randn(4),index = dates) # 根据时间列表创建
# 生成时间戳的时间序列的方法
# pd.date_range('开始时间','结束时间'/periods = 个数,normalize = True,freq = '时间频率' )
# normalize 正则化开关,去掉时分秒的时间 freq Q 季度 M 月 d 天 w 星期 nH 几个小时 默认时间频
# p = pd.Period(2010,freq = 时间频率)
# 时期序列
# a = pd.period_range('开始时期','结束时期'/periods = 个数,freq = 'M')
# 时期转换
# a.asfreq('M')