简说Python,号主老表,Python终身学习者,数据分析爱好者,从18年开始分享Python知识,原创文章227篇,写过Python、SQL、Excel入门文章,也写过Web开发、数据分析文章,老表还总结整理了一份2022Python学习资料和电子书资源,关注后私信回复:2022 即可领取。
基础包导入
这个一篇针对pandas新手的简短入门,想要了解更多复杂的内容,参阅Cookbook:https://pandas.pydata.org/pandas-docs/stable/user_guide/cookbook.html
通常,我们首先要导入以下几个库:
%matplotlib inline import pandas as pd import numpy as np import matplotlib.pyplot as plt
创建对象
通过传递一个list来创建Series,pandas会默认创建整型索引:
s = pd.Series([1,3,5,np.nan,6,8]) s
通过传递一个numpy array,日期索引以及列标签来创建一个DataFrame:
dates = pd.date_range('20130101', periods=6) dates
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) df
通过传递一个能够被转换为类似series的dict对象来创建一个DataFrame:
df2 = pd.DataFrame({ 'A' : 1., 'B' : pd.Timestamp('20130102'), 'C' : pd.Series(1,index=list(range(4)),dtype='float32'), 'D' : np.array([3]*4,dtype='int32'), 'E' : pd.Categorical(["test","train","test","train"]), 'F' : 'foo' }) df2
可以看到各列的数据类型为:
df2.dtypes
查看数据
查看frame中头部和尾部的几行:
df.head()
df.tail(3)
显示索引、列名以及底层的numpy数据
df.index
df.columns
Index(['A', 'B', 'C', 'D'], dtype='object')
df.values
describe()能对数据做一个快速统计汇总
df.describe()
对数据做转置:
df.T
按轴进行排序:
df.sort_index(axis=1, ascending=False)
按值进行排序 :
df.sort_values(by='B')
数据选择
注意:虽然标准的Python/Numpy的表达式能完成选择与赋值等功能,但我们仍推荐使用优化过的pandas数据访问方法:.at,.iat,.loc,.iloc和.ix
选取
选择某一列数据,它会返回一个Series,等同于df.A:
df['A']
通过使用**[ ]**进行切片选取:
df[0:3]
df['20130102':'20130104']
通过标签选取
通过标签进行交叉选取:
df.loc[dates[0]]
A -0.900524 B -0.302515 C -0.541762 D 1.562916 Name: 2013-01-01 00:00:00, dtype: float64
使用标签对多个轴进行选取
df.loc[:,['A','B']]
df.loc[:,['A','B']][:3]
进行标签切片,包含两个端点
df.loc['20130102':'20130104',['A','B']]
对于返回的对象进行降维处理
df.loc['20130102',['A','B']]
A -0.884117 B -0.650741 Name: 2013-01-02 00:00:00, dtype: float64
获取一个标量
df.loc[dates[0],'A']
-0.9005238449408509
快速获取标量(与上面的方法等价)
df.at[dates[0],'A']
-0.9005238449408509
通过位置选取
通过传递整型的位置进行选取
df.iloc[3]
A 1.260276 B 1.000297 C 0.809801 D -0.389713 Name: 2013-01-04 00:00:00, dtype: float64
通过整型的位置切片进行选取,与python/numpy形式相同
df.iloc[3:5,0:2]
只对行进行切片
df.iloc[1:3,:]
A | B | C | D | |
2013-01-02 | -0.884117 | -0.650741 | 0.217345 | 0.268915 |
2013-01-03 | 0.220822 | 0.790527 | 0.692172 | 0.723441 |
只对列进行切片
df.iloc[:,1:3]
B | C | |
2013-01-01 | -0.302515 | -0.541762 |
2013-01-02 | -0.650741 | 0.217345 |
2013-01-03 | 0.790527 | 0.692172 |
2013-01-04 | 1.000297 | 0.809801 |
2013-01-05 | 1.468609 | 0.360648 |
2013-01-06 | 0.235352 | 1.117395 |
只获取某个值
df.iloc[1,1]
-0.6507407272837356
快速获取某个值(与上面的方法等价)
df.iat[1,1]
-0.6507407272837356
布尔索引
用某列的值来选取数据
df[df.A > 0]
用where操作来选取数据
df[df > 0]
用**isin()**方法来过滤数据
df2 = df.copy()
df2['E'] = ['one', 'one', 'two', 'three', 'four', 'three'] df2
df2[df2['E'].isin(['two', 'four'])]
赋值
赋值一个新的列,通过索引来自动对齐数据
s1 = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130102',periods=6)) s1
2013-01-02 1 2013-01-03 2 2013-01-04 3 2013-01-05 4 2013-01-06 5 2013-01-07 6 Freq: D, dtype: int64
df['F'] = s1 df
通过标签赋值
df.at[dates[0], 'A'] = 0 df
通过位置赋值
df.iat[0,1] = 0 df
通过传递numpy array赋值
df.loc[:,'D'] = np.array([5] * len(df)) df
通过where操作来赋值
df2 = df.copy() df2[df2 > 0] = -df2 df2
缺失值处理
在pandas中,用np.nan来代表缺失值,这些值默认不会参与运算。
reindex()允许你修改、增加、删除指定轴上的索引,并返回一个数据副本。
df1 = df.reindex(index=dates[0:4], columns=list(df.columns)+['E']) df1.loc[dates[0]:dates[1],'E'] = 1 df1
剔除所有包含缺失值的行数据
df1.dropna(how='any')
填充缺失值
df1.fillna(value=5)
获取值是否为nan的布尔标记
pd.isnull(df1)
运算
统计
运算过程中,通常不包含缺失值。
进行描述性统计
df.mean()
对其他轴进行同样的运算
df.mean(1)
对于拥有不同维度的对象进行运算时需要对齐。除此之外,pandas会自动沿着指定维度计算。
s = pd.Series([1,3,5,np.nan,6,8], index=dates).shift(2) s
df.sub(s, axis='index')
Apply 函数作用
通过apply()对函数作用
df.apply(np.cumsum)
df.apply(lambda x:x.max()-x.min())
频数统计
s = pd.Series(np.random.randint(0, 7, size=10)) s
s.value_counts()
字符串方法
对于Series对象,在其str属性中有着一系列的字符串处理方法。就如同下段代码一样,能很方便的对array中各个元素进行运算。值得注意的是,在str属性中的模式匹配默认使用正则表达式。
s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']) s.str.lower()