pandas简介
pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具,pandas提供了大量能使我们快速便捷地处理数据的函数和方法。
数据结构
- Series:一维数组,与Numpy中的一维array类似。二者与Python基本的数据结构List也很相近,其区别是:List中的元素可以是不同的数据类型,而Array和Series中则只允许存储相同的数据类型,这样可以更有效的使用内存,提高运算效率。
- DataFrame:二维的表格型数据结构。很多功能与R中的data.frame类似。可以将DataFrame理解为Series的容器。以下的内容主要以DataFrame为主。
重新索引
pandas一个重要的方法是重新索引,创建一个新索引的新对象。(方法我只应用一遍,其他自己多加思考:如series.reindex(range(8),method='ffill') 还可以series.reindex(range(8),method='bfill'))
series=pd.Series([1,2,3,4,5,6,7],index=['less0','less1','less2','less3','less4','less5','less6'])less0 1less1 2less2 3less3 4less4 5less5 6less6 7dtype: int64series.reindex(['less1','less0','less2','less3','less4','less5','less6','b'])less1 2.0less0 1.0less2 3.0less3 4.0less4 5.0less5 6.0less6 7.0b NaNdtype: float64series.reindex(['12','211'])12 NaN211 NaNdtype: float64series.reindex(['12','211'],fill_value=0)12 0211 0dtype: int64series=pd.Series([1,2,3,4,5,6])series.reindex(range(8),method='ffill')0 11 22 33 44 55 66 67 6dtype: int64dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d'])dataframeIn [3]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: dataframe ...: Out[3]: a b c d1 0 1 2 32 4 5 6 73 8 9 10 114 12 13 14 15In [4]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d'])Out[4]: c b a d2 6 5 4 71 2 1 0 33 10 9 8 114 14 13 12 15In [5]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'])Out[5]: c b a d e2 6.0 5.0 4.0 7.0 NaN1 2.0 1.0 0.0 3.0 NaN3 10.0 9.0 8.0 11.0 NaN4 14.0 13.0 12.0 15.0 NaNIn [6]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='ffill')Out[6]: c b a d e2 6 5 4 7 71 2 1 0 3 33 10 9 8 11 114 14 13 12 15 15In [7]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='bfill')Out[7]: c b a d e2 6 5 4 7 NaN1 2 1 0 3 NaN3 10 9 8 11 NaN4 14 13 12 15 NaNIn [8]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='bfill',fill_value=0)Out[8]: c b a d e2 6 5 4 7 01 2 1 0 3 03 10 9 8 11 04 14 13 12 15 0#copy 默认是true 怎样都复制,false的时候新旧相等不复制In [9]: dataframe.reindex(index=[2,1,3,4],columns=['c','b','a','d','e'],method='bfill',fill_value=0,copy=True)Out[9]: c b a d e2 6 5 4 7 01 2 1 0 3 03 10 9 8 11 04 14 13 12 15 0
丢弃指定轴上的数据
series=pd.Series([1,2,3,4,5,6,7],index=['less0','less1','less2','less3','less4','less5','less6'])series.drop(['less1','less0','less2'])less3 4less4 5less5 6less6 7dtype: int64In [10]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: dataframe.drop([1,2]) ...: Out[10]: a b c d3 8 9 10 114 12 13 14 15In [11]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: dataframe.drop(columns=['a','b'],index=[1,2]) ...: Out[11]: c d3 10 114 14 15
索引选取过滤
series=pd.Series([1,2,3,4,5,6])series0 11 22 33 44 55 6dtype: int64In [12]: series=pd.Series([1,2,3,4,5,6]) ...: series[series>2] ...: Out[12]: 2 33 44 55 6dtype: int64In [13]: series=pd.Series([1,2,3,4,5,6]) ...: series[2] ...: Out[13]: 3series=pd.Series([1,2,3,4,5,6])series[2:5]2 33 44 5dtype: int64series=pd.Series([1,2,3,4,5,6])series[2:5]=7series0 11 22 73 74 75 6dtype: int64In [14]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: dataframe ...: Out[14]: a b c d1 0 1 2 32 4 5 6 73 8 9 10 114 12 13 14 15In [16]: dataframe.loc[[1,2,3],['a','c']]Out[16]: a c1 0 22 4 63 8 10In [17]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: dataframe[dataframe['a']>3] ...: Out[17]: a b c d2 4 5 6 73 8 9 10 114 12 13 14 15In [18]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: dataframe[dataframe.loc[[1,2,3],['a','c']]>3] ...: Out[18]: a b c d1 NaN NaN NaN NaN2 4.0 NaN 6.0 NaN3 8.0 NaN 10.0 NaN4 NaN NaN NaN NaNIn [20]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: dataframe[dataframe<3]=0 ...: dataframe ...: Out[20]: a b c d1 0 0 0 32 4 5 6 73 8 9 10 114 12 13 14 15
函数的应用和映射
In [20]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: dataframe[dataframe<3]=0 ...: dataframe ...: Out[20]: a b c d1 0 0 0 32 4 5 6 73 8 9 10 114 12 13 14 15In [21]: In [21]: In [21]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: f=lambda x :x.max()-x.min() ...: dataframe.apply(f,axis=1) ...: Out[21]: 1 32 33 34 3dtype: int64In [22]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=['a','b','c','d']) ...: f=lambda x :x.max()-x.min() ...: dataframe.apply(f,axis=0) ...: Out[22]: a 12b 12c 12d 12dtype: int64#应用在元素及的函数dataframe.applymap(f2)In [24]: f2=lambda x:x/2In [25]: dataframe.applymap(f2)Out[25]: a b c d1 0.0 0.5 1.0 1.52 2.0 2.5 3.0 3.53 4.0 4.5 5.0 5.54 6.0 6.5 7.0 7.5 #一维数组直接用apply()series=pd.Series([1,2,3,4,5,6])series.apply(f2)0 0.51 1.02 1.53 2.04 2.55 3.0dtype: float64
常用函数
df 代表的是任意的Pandas DataFrame对象 s 代表的是任意的Pandas Series对象
-
导入数据
pd.read_csv(filename):从CSV文件导入数据pd.read_table(filename):从限定分隔符的文本文件导入数据
pd.read_excel(filename):从Excel文件导入数据
pd.read_sql(query,connection_object):从SQL表/库导入数据
pd.read_json(json_string):从JSON格式的字符串导入数据
pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据
-
导出数据 df.to_csv(filename):导出数据到CSV文件
df.to_excel(filename):导出数据到Excel文件
df.to_sql(table_name,connection_object):导出数据到SQL表
df.to_json(filename):以Json格式导出数据到文本文件
-
查看、检查数据 df.head(n):查看DataFrame对象的前n行
df.tail(n):查看DataFrame对象的最后n行
df.shape():查看行数和列数
df.describe():查看数值型列的汇总统计
s.value_counts(dropna=False):查看Series对象的唯一值和计数
-
数据选取 df[col]:根据列名,并以Series的形式返回列
df[[col1,col2]]:以DataFrame形式返回多列
s.iloc[0]:按位置选取数据
s.loc['index_one']:按索引选取数据
df.iloc[0,:]:返回第一行
df.iloc[0,0]:返回第一列的第一个元素
-
数据清理
df.columns=['a','b','c']:重命名列名pd.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
pd.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
df.dropna():删除所有包含空值的行
df.dropna(axis=1):删除所有包含空值的列
df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
df.fillna(x):用x替换DataFrame对象中所有的空值
s.astype(float):将Series中的数据类型更改为float类型
s.replace(1,'one'):用‘one’代替所有等于1的值
s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3
df.rename(columns=lambdax:x+1):批量更改列名
df.rename(columns={'old_name':'new_ name'}):选择性更改列名
df.set_index('column_one'):更改索引列
df.rename(index=lambdax:x+1):批量重命名索引
In [27]: dataframe=pd.DataFrame(np.arange(16).reshape((4,4)),index=[1,2,3,4],columns=[1,2,3,4]) ...: dataframe ...: dataframe.set_index(4) ...: Out[27]: 1 2 343 0 1 27 4 5 611 8 9 1015 12 13 14
-
数据处理:Filter、Sort和GroupBy
df[df[col]>0.5]:选择col列的值大于0.5的行df.sort_values(col1):按照列col1排序数据,默认升序排列
df.sort_values(col2,ascending=False):按照列col1降序排列数据
df.sort_values([col1,col2],ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据 df.groupby(col):返回一个按列col进行分组的Groupby对象
df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值 df.pivot_table(index=col1,
values=[col2,col3],aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max
-
数据合并
df1.append(df2):将df2中的行添加到df1的尾部pd.concat([df1,df2],axis=1):将df2中的列添加到df1的尾部
df1.join(df2,on=col1,how='inner'):对df1的列和df2的列执行SQL形式的join
-
数据统计
df.describe():查看数据值列的汇总统计df.mean():返回所有列的均值
df.corr():返回列与列之间的相关系数
df.count():返回每一列中的非空值的个数
df.max():返回每一列的最大值
df.min():返回每一列的最小值
df.median():返回每一列的中位数
df.std():返回每一列的标准差
层次化索引
pd.Series([1,2,34,5,67,8,90,23,4,5],index=[['one','one','one','two','one','one','three','three','three','three'],[1,2,3,4,5,6,7,8,9,10]])one 1 1 2 2 3 34two 4 5one 5 67 6 8three 7 90 8 23 9 4 10 5dtype: int64series['one']1 12 23 345 676 8dtype: int64series['one',3]#重排分级顺序series=pd.Series([1,2,34,5,67,8,90,23,4,5],index=[['one','one','one','two','one','one','three','three','three','three'],[1,2,3,4,5,6,7,8,9,10]])#同理列也可以指定名称series.index.names=['key1','key2']key1 key2one 1 1 2 2 3 34two 4 5one 5 67 6 8three 7 90 8 23 9 4 10 5dtype: int64series.swaplevel('key2','key1')key2 key1 1 one 12 one 23 one 344 two 55 one 676 one 87 three 908 three 239 three 410 three 5dtype: int64#更具级别获取统计数据series.sum(level='key1')key1one 112two 5three 122dtype: int64series.sum(level='key2')key21 12 23 344 55 676 87 908 239 410 5dtype: int64