Series 可以看做一个定长的有序字典。基本任意的一维数据都可以用来构造 Series 对象:
import pandas as pds=pd.Series([1,2,3,4,5,6])print(s)0 11 22 33 44 55 6se = pd.Series({'a':1,'b':2})
Series 对象包含两个主要的属性:index 和 values,分别为上例中左右两列。
s = Series(data=[1,3,5,7],index = ['a','b','x','y'])sa 1b 3x 5y 7
Series 对象和它的 index 都含有一个 name 属性:
s.name = 'a_series's.index.name = 'the_index'sthe_indexa 1b 3x 5y 7Name: a_series, dtype: int64
Numpy获取Series
s = np.Series(np.random.random(5),index=list('abcde'))
可以像List一样使用Series
s[1:]s[2:3]s["a"]s["b"]s.get("e",0)#比较安全的方式
可以使用bool索引
s[s>2]
可以使用所有的ndarray运算操作
DataFrame 是一个表格型的数据结构,它含有一组有序的列(类似于 index),每列可以是不同的值类型(不像 ndarray 只能有一个 dtype)。基本上可以把 DataFrame 看成是共享同一个 index 的 Series 的集合。
data = {'state':['Ohino','Ohino','Ohino','Nevada','Nevada'],'year':[2000,2001,2002,2001,2002],'pop':[1.5,1.7,3.6,2.4,2.9]}pd.DataFrame(data)
使用Series构造DataFrame
df = pd.DataFrame({'apts':apts,'cars':cars})
使用list of dicts 来构造DataFrame
data = [{'july':99,'Han':200}]
pd.DataFrame(data)
DataFrame(data=None,index=None,coloumns=None)
data=[[1,2,3],[5,6,7],[11,12,13],[4,5,6],[7,8,9]]df=pd.DataFrame(data,index=['one','two','three','four','five'],columns=['year','state','pop'])
DataFrame 面向行和面向列的操作基本是平衡的,任意抽出一列都是 Series
//定义数据date=np.arange(12).reshape(3,4)df=pd.DataFrame(date,index=['x','y','z'],columns=['a','b','c','d'])
以下标的方式获取行,只能是序列
df[:2] a b c d x 0 1 2 3 y 4 5 6 7//注:当为df[0]时会报错
选择行,以标签名的形式,只能是序列,包含最后一个元素
df['x':'z'] a b c d x 0 1 2 3 y 4 5 6 7 z 8 9 10 11
选择列,若一列则类型为Series
df.a x 0 y 4 z 8
或
df['a'] x 0 y 4 z 8
或
df[['a','b']] a b x 0 1 y 4 5 z 8 9
选择行时
df.loc['x'] a 0 b 1 c 2 d 3
或
df.loc[['x','y'],['a','b']] a b x 0 1 y 4 5
或
df.loc['x',['a','b']]
a 0
b 1
使用位置选择
df.iloc[1:3,2:4] //取1,2行,2,3列c d
y 6 7
z 10 11
或
df.iloc[:,1] //第一列c
x 2
z 10
或
df.iloc[1,:] //取一行的所有列
a 4
b 5
c 6
d 7
混合使用标签和位置
df.ix[1] //取第一行
df.ix[:2,[‘a’,‘b’]]//取第二行,与’a’,‘b’列
使用bool参数
df[df>5]=99 df a b c d x 0 1 2 3 y 4 5 99 99 z 99 99 99 99
修改某一列
dff['a']=5
dff a b c d
1 5 1 2 3
2 5 5 6 7
3 5 9 10 11
修改某一列
df['a']=[5,6,4]dffa b c d x 5 1 2 3 y 6 5 6 7 z 4 9 10 11
添加某一列
data=[2,3,10]
dff['e']=data dff a b c e 1 5 1 2 2 2 5 5 6 3 3 5 9 10 10
删除某一列
del dff['d']
dff a b c
1 5 1 2
2 5 5 6
3 5 9 10
对columns进行排序
df2 a b c d 1 0 1 2 3 2 4 5 6 7 3 8 9 10 11 df2.sort_index(axis=1,ascending=False) d c b a 1 3 2 1 0 2 7 6 5 4 3 11 10 9 8
对index进行排序
df2.sort_index(axis=0,ascending=False) a b c d
3 8 9 10 11
2 4 5 6 7
1 0 1 2 3
对某列进行排序
df2.sort_values(by='b')a b c d
1 0 1 2 3
2 4 5 6 7
3 8 9 10 11
df a b c d 1 0 1 2 3 2 4 5 6 7 3 8 9 10 11
找寻最小值
df.a.min()
筛选符合条件的行
df[df.a>=4] a b c d
2 4 5 6 7
3 8 9 10 11
index在(1,3)之间的行
f[(df.index>1) & (df.index<3)] a b c d
2 4 5 6 7
pivot_table
df.pivot_table(index&#61;"year",values&#61;"state",aggfunc&#61;np.mean)
//或
df.pivot_table(index&#61;"year",values&#61;[&#39;state&#39;,&#39;pop&#39;],aggfunc&#61;np.mean)
apply
def plus(df,n,m):
df[&#39;c&#39;] &#61; (df[&#39;a&#39;]&#43;df[&#39;b&#39;]) * m
df[&#39;d&#39;] &#61; (df[&#39;a&#39;]&#43;df[&#39;b&#39;]) * n
return df
list1 &#61; [[1,3],[7,8],[4,5]]
df1 &#61; pd.DataFrame(list1,columns&#61;[&#39;a&#39;,&#39;b&#39;])
df1 &#61; df1.apply(plus,axis&#61;1,args&#61;(2,3,))
print(df1)
//默认情况下 将表格中的每列传入方法中&#xff0c;此处将每行传入方法中
quantile
获取分位数
qcut
等平分组
diff
参数理解
创建数据
import numpy as npimport pandas as pddf &#61; pd.DataFrame({&#39;key1&#39;:[&#39;a&#39;,&#39;a&#39;,&#39;b&#39;,&#39;b&#39;,&#39;a&#39;],&#39;key2&#39;:[&#39;one&#39;,&#39;two&#39;,&#39;one&#39;,&#39;two&#39;,&#39;one&#39;],&#39;data1&#39;:np.random.randn(5),&#39;data2&#39;:np.random.randn(5),&#39;data3&#39;:np.random.randn(5),&#39;data4&#39;:np.random.randn(5)})
使用Series或Series序列来进行groupby
#使用Series进行分组dg1 &#61; df.groupby(df.key1,as_index&#61;True)#使用Series序列进行分组dg2 &#61; df.groupby([df.key1,df.key2],as_index&#61;True)
使用列名或列名列表进行分组
#使用列名dg3 &#61; df.groupby(&#39;key1&#39;,as_index&#61;True)dg3.first()#使用列名列表dg4 &#61; df.groupby([&#39;key1&#39;,&#39;key2&#39;],as_index&#61;True)dg4.first()
使用外部数据进行分组
years &#61; np.array([2005,2005,2006,2005,2006])dg5 &#61; df.groupby(years)
使用字典进行groupby
#行向mapping &#61; {0:&#39;one&#39;,1:&#39;one&#39;,2:&#39;one&#39;,3:&#39;two&#39;,4:&#39;two&#39;}dg6 &#61;df.groupby(mapping)#列向mapping &#61; {&#39;data1&#39;:1,&#39;data2&#39;:2,&#39;data3&#39;:1,&#39;data4&#39;:2}df7 &#61; df.groupby(mapping,axis&#61;1)df7.first()
使用函数进行分组
#列向分组mapping &#61; {&#39;data1&#39;:1,&#39;data2&#39;:2,&#39;data3&#39;:1,&#39;data4&#39;:2}df7 &#61; df.groupby(mapping,axis&#61;1)df7.first()#行向分组def fun(x):if x<2 :return 1else :return 2df8 &#61; df.groupby(fun)
使用索引分组
columns &#61; pd.MultiIndex.from_arrays([[&#39;US&#39;,&#39;US&#39;,&#39;US&#39;,&#39;JP&#39;,&#39;JP&#39;],[1,3,5,1,3]],names &#61; [&#39;cty&#39;,&#39;tenor&#39;])df &#61; DataFrame(np.random.randn(4,5),columns&#61;columns)print(df)df.groupby(level&#61;&#39;cty&#39;,axis&#61;1)
as_index
f &#61; pd.DataFrame({&#39;age&#39;:[10,20,10,30,20,20,30],&#39;name&#39;:[&#39;zhao&#39;,&#39;qian&#39;,&#39;sun&#39;,&#39;li&#39;,&#39;zhao&#39;,&#39;qian&#39;,&#39;qian&#39;]},index &#61; [1,2,3,4,5,6,7])#将name设置为分组的索引fg &#61; f.groupby(&#39;name&#39;,as_index&#61;True)
获取分组属性
#获取分组信息fg.groups#获取某个分组的信息fg.get_group(&#39;第一组&#39;)
迭代分组
for name,group in group_by_name:print(name)print(group)
构造数据集
import pandas as pdimport numpy as np%matplotlib inlinesalaries &#61; pd.DataFrame({&#39;Name&#39;: [&#39;July&#39;, &#39;Zewei&#39;, &#39;Zewei&#39;, &#39;Han&#39;, &#39;July&#39;, &#39;July&#39;, &#39;Zewei&#39;, &#39;July&#39;],&#39;Year&#39;: [2016,2016,2016,2016,2017,2017,2017,2017],&#39;Salary&#39;: [10000,2000,4000,5000,18000,25000,3000,4000],&#39;Bonus&#39;: [3000,1000,1000,1200,4000,2300,500,1000]})
使用聚合
group_by_name &#61; salaries.groupby(&#39;Name&#39;,sort&#61;True)#直接使用count函数group_by_name.count()#使用agg方法传入函数group_by_name.agg(np.size)#使用多个函数group_by_name.agg([min,max])#对不同的列使用不同的函数group_by_name.agg({&#39;Year&#39;:min,&#39;Salary&#39;:max})
数据
使用与上文相同的数据
使用对应的函数
zscore &#61; lambda x:(x-x.mean())/x.std()transformed &#61; group_by_name.transform(zscore)transformed.head()
数据
使用上文相同的数据
进行对应的操作
#使用聚合函数group_by_name.apply(sum)#使用非聚合函数group_by_name.apply(lambda x:(x-x.mean())/x.std())
filter操作
group_by_name.filter(lambda x : len(x)>3 )
表格拼接之Concat
创建数据
import pandas as pdimport numpy as npdf1 &#61; pd.DataFrame({&#39;apts&#39;: [55000, 60000],&#39;cars&#39;: [200000, 300000],},index &#61; [&#39;Shanghai&#39;, &#39;Beijing&#39;])df2 &#61; pd.DataFrame({&#39;cars&#39;: [150000, 120000],&#39;apts&#39;: [25000, 20000],},index &#61; [&#39;Hangzhou&#39;, &#39;Najing&#39;])df3 &#61; pd.DataFrame({&#39;apts&#39;: [30000, 10000],&#39;cars&#39;: [180000, 100000],&#39;mar&#39;: [180000, 100000]},index &#61; [&#39;Guangzhou&#39;, &#39;Chongqing&#39;])
全部使用默认值进行连接
pd.concat([df1,df2,df3],sort &#61; True)
重新计算索引并标记为0~n-1&#xff08;此时会使keys参数失效&#xff09;
pd.concat([df1,df2,df3],ignore_index&#61;True)
使用keys参数
re &#61; pd.concat([df1,df2,df3],sort&#61;True,keys&#61;[&#39;x&#39;,&#39;y&#39;,&#39;z&#39;])
当使用keys参数后可以使用以下索引方式
re.loc[&#39;x&#39;,&#39;cars&#39;]re.loc[(&#39;x&#39;,&#39;shanghai&#39;),&#39;cars&#39;]
列向连接
df4 &#61; pd.DataFrame({&#39;salaries&#39;: [10000, 30000, 30000, 20000, 15000]},index &#61; [&#39;Suzhou&#39;, &#39;Beijing&#39;, &#39;Shanghai&#39;, &#39;Guangzhou&#39;, &#39;Tianjin&#39;])pd.concat([re, df4], axis&#61;1, sort&#61;False)
可以指定连接方式
pd.concat([re, df4], axis&#61;1, join&#61;&#39;inner&#39;)#也可指定为outer
使用join_axes来构造出left_join right_join的效果
r2&#61;pd.concat([re, df4], axis&#61;1,sort&#61;False,join_axes&#61;[re.index])r3&#61; pd.concat([re, df4], axis&#61;1,sort&#61;False,join_axes&#61;[df4.index])r4&#61; pd.concat([re, df4], axis&#61;1,sort&#61;False)
Series和DataFrame可以被一起concatenate
append是限制axis&#61;0 的concatenate
数据
df1 &#61; pd.DataFrame({&#39;apts&#39;: [55000, 60000, 58000],&#39;cars&#39;: [200000, 300000,250000],&#39;city&#39;: [&#39;Shanghai&#39;, &#39;Beijing&#39;,&#39;Shenzhen&#39;]})df4 &#61; pd.DataFrame({&#39;salaries&#39;: [10000, 30000, 30000, 20000, 15000],&#39;city&#39;: [&#39;Suzhou&#39;, &#39;Beijing&#39;, &#39;Shanghai&#39;, &#39;Guangzhou&#39;, &#39;Tianjin&#39;]})
使用简单连接
result &#61; pd.merge(df1, df4, on&#61;&#39;city&#39;)#默认使用内链接
复杂连接
#使用外连接&#xff0c;也存在 left right等连接result &#61; pd.merge(df1, df4, on&#61;&#39;city&#39;, how&#61;&#39;outer&#39;)
使用索引完成连接
df1 &#61; pd.DataFrame({&#39;apts&#39;: [55000, 60000, 58000],&#39;cars&#39;: [200000, 300000,250000]},index&#61;[&#39;Shanghai&#39;, &#39;Beijing&#39;,&#39;Shenzhen&#39;])df4 &#61; pd.DataFrame({&#39;salaries&#39;: [10000, 30000, 30000, 20000, 15000]},index&#61;[&#39;Suzhou&#39;, &#39;Beijing&#39;, &#39;Shanghai&#39;, &#39;Guangzhou&#39;, &#39;Tianjin&#39;])
#使用join完成
df1.join(df4)
#使用merge
pd.merge(df1, df4, left_index&#61;True, right_index&#61;True, how&#61;‘outer’)
指定索引
pd.merge(df1,df2,left_on&#61;[&#39;cars&#39;],right_on&#61;[&#39;cars&#39;],how&#61;&#39;outer&#39;)
rename
ratings_mean &#61; ratings.groupby("movieId").agg({"rating": np.mean, "timestamp": "count"}).rename(columns&#61;{"timestamp": "count"})
reindex
a&#61; np.arange(10).reshape(2,5)s &#61; pd.DataFrame(data&#61;a,columns&#61;[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;])s.reindex(index &#61; [1,0],columns&#61;[&#39;e&#39;,&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;])
判断是否为空(填充内容)
apts.notnull()
Beijing True
Guangzhou True
Hangzhou True
Shanghai True
Shenzhen True
Suzhou False
Name: price, dtype: boolapts.isnull()
Beijing False
Guangzhou False
Hangzhou False
Shanghai False
Shenzhen False
Suzhou True
Name: price, dtype: bool
fillna
定义
a&#61; np.arange(15).reshape(3,5)s &#61; pd.DataFrame(data&#61;a,columns&#61;[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;])s.iloc[1,[0,1]]&#61;np.nan
直接填充
fillna(0)
使用前一个值填充
s.fillna(method&#61;&#39;pad&#39;)
使用后面的值填充
s.fillna(method&#61;&#39;bfill&#39;)
reset_index
将索引列还原为普通列
drop
a&#61; np.arange(15).reshape(3,5)
s &#61; pd.DataFrame(data&#61;a,columns&#61;[&#39;a&#39;,&#39;b&#39;,&#39;c&#39;,&#39;d&#39;,&#39;e&#39;])
#删除索引为0&#xff0c;1的行
s.drop([0,1])
#删除列
s.drop(&#39;a&#39;,axis&#61;1)
dropna
默认滤除所有包含NaN&#xff1a;
s.dropna()
传入how &#61; ‘all’ 滤除全为NaN的行
s.dropna(how&#61;&#39;all&#39;)
删除全为NaN的列
s.dropna(how&#61;&#39;all&#39;,axis&#61;1)
基本操作
pokemon&#61;pd.read_csv("文件路径")pokemon.head()#查看前几行数据pokemon.describe()#数据描述
#查看数据缺失
pokemon.isnull()
#查看缺失列
pokemon.isnull().any()
#补足
pokenmon.loc[pokemon[‘Type 2’].isnull(),‘Type 2’’]&#61;0
补足数据时常用的方法
举例
举例
读出
pokenmon.to_csv(“文件路径”)