pandas
series
创建series
# 创建一个空的系列
s = pd.Series()
# ndarray、数组创建一个系列
data = np.array(['a','b','c','d'])
s = pd.Series(data,index=[100,101,102,103])
# 从字典创建一个系列
data = {'a' : 0., 'b' : 1., 'c' : 2.}
s = pd.Series(data)
# 从标量创建一个系列
s = pd.Series(5, index=[0, 1, 2, 3])
元素访问
# 使用索引检索元素
s =pd.Series([1,2,3,4,5],index = ['a','b','c','d','e'])
print(s[0], s[:3], s[-3:])
# 使用标签检索数据
print(s['a'], s[['a','c','d']])
pandas日期处理
# to_datetime() 转换日期数据类型
dates = pd.to_datetime(dates)
# datetime类型数据支持日期运算
delta = dates - pd.to_datetime('1970-01-01')
# 以日为频率
Datelist = pd.date_range('2019/08/21',
periods=5,freq='M')
# 表示商业日期范围
datelist = pd.bdate_range('2011/11/03', periods=5)
Series.dt.year/Series.dt.month/Series.dt.day/Series.dt.weekofyear/Series.dt.is_year_end
DataFrame
创建dataframe
# 外层为列表,表示行。
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=['Name','Age'])
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
# 外层为字典,表示列。
data={'Name':['Tom','Jack','Steve','Ricky'],'Age':[28,34,29,42]}
df=pd.DataFrame(data,index=['s1','s2','s3','s4'])
data = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(data)
访问DataFrame
#### iloc访问:
行列都能:df.iloc[2][0]
#### 列访问:
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b', 'c']), 'two' : pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])}
df = pd.DataFrame(d)
df['one']
df[['one', 'two']] #掩码读取
df['score']=pd.Series([90, 80, 70, 60], index=['s1','s2','s3','s4']) #添加
df.pop('two') #删除
#### 行访问:
df[2:4] #索引访问
df.loc['b']
df.loc[['a', 'b']] #loc加掩码访问
#### 行添加:
df2 = pd.DataFrame([['ww', 16], ['zl', 8]], columns = ['Name','Age'])
df = df.append(df2)
df = df.drop(0) # 删除index为0的行
#### 修改DataFrame中的数据:
df['Name'][0] = 'Tom' #修改通常通过行进行
pandas核心
排序
#### 按行标签排序:
sorted_df=unsorted_df.sort_index() #行索引
sorted_df = unsorted_df.sort_index(ascending=False) #行索引降序
#### 按列标签排序:
sorted_df=unsorted_df.sort_index(axis=1) # 按照列标签进行排序
#### 按某列值排序:
sorted_df = unsorted_df.sort_values(by=['Age', 'Rating'], ascending=[True, False]) # 先按Age进行升序排序,然后按Rating降序排序
分组聚合
groups = df.groupby('Year') #遍历每个分组
for year,group in groups:
print (year)
print (group)
groups.get_group(2014) #获取2014年组内容
# 聚合每一年的平均的分
grouped = df.groupby('Year')
print (grouped['Points'].agg(np.mean))
# 聚合每一年的分数之和、平均分、标准差
grouped = df.groupby('Year')
agg = grouped['Points'].agg([np.sum, np.mean, np.std])
print (agg)
数据表关联操作
data = pd.merge(left,right) #默认是内连接
rs = pd.merge(left, right, how='left')
rs = pd.merge(left,right,on='subject_id', how='right')
透视表与交叉表
根据一个或多个键对数据进行分组聚合,并根据每个分组进行数据汇总。
交叉表(crosstab)是一种用于计算分组频率的特殊透视表。
data.pivot_table(index=['class_id', 'gender'], values=['score'],columns=['age'],
margins=True, aggfunc='max') #透视表
pd.crosstab(data.class_id,data.gender, margins=True) #交叉表统计数量
pandas可视化
条形图
df = pd.DataFrame(np.random.rand(10,4),columns=['a','b','c','d'])
df.plot.bar()
直方图
df = pd.DataFrame()
df.plot.hist(bins=20) # 分成20份
散点图
df = pd.DataFrame(np.random.rand(50, 4), columns=['a', 'b', 'c', 'd'])
df.plot.scatter(x='a', y='b')
饼状图
df = pd.DataFrame(3 * np.random.rand(4), index=['a', 'b', 'c', 'd'], columns=['x'])
df.plot.pie(subplots=True)
数据读取与存储
#### 读取与存储csv:
# filepath 文件路径。该字符串可以是一个URL。有效的URL方案包括http,ftp和file
# sep 分隔符。read_csv默认为“,”,read_table默认为制表符“[Tab]”。
# header 接收int或sequence。表示将某行数据作为列名。默认为infer,表示自动识别。
# names 接收array。表示列名。
# index_col 表示索引列的位置,取值为sequence则代表多重索引。
# dtype 代表写入的数据类型(列名为key,数据格式为values)。
# engine 接收c或者python。代表数据解析引擎。默认为c。
# nrows 接收int。表示读取前n行。
pd.read_table(filepath_or_buffer,sep='\t',header='infer',names=None,index_col=None,dtype=None, engine=None, nrows=None)
pd.read_csv(filepath_or_buffer,sep=',',header='infer',names=None,index_col=None,dtype=None, engine=None, nrows=None)
#### 存储为csv:
DataFrame.to_csv(excel_writer=None, sheetname=None, header=True, index=True, index_label=None, mode=’w’, encoding=None)
#### 读取与存储excel:
# io 表示文件路径。
# sheetname 代表excel表内数据的分表位置。默认为0。
# header 接收int或sequence。表示将某行数据作为列名。默认为infer,表示自动识别。
# names 表示索引列的位置,取值为sequence则代表多重索引。
# index_col 表示索引列的位置,取值为sequence则代表多重索引。
# dtype 接收dict。数据类型。
pandas.read_excel(io, sheetname=0, header=0, index_col=None, names=None, dtype=None)