Pandas
一、Pandas与NumPy的区别
如果用 python 的列表和字典来作比较, 那么可以说 Numpy 是列表形式的,没有数值标签,而 Pandas 就是字典形式。Pandas是基于Numpy构建的,让Numpy为中心的应用变得更加简单。
二、导入模块
import Pandas as pd #为了方便使用Pandas 采用pd简写
三、Series
Series的字符串表现形式为:索引在左边,值在右边。由于我们没有为数据指定索引。于是会自动创建一个0到N-1(N为长度)的整数型索引。
s = pd.Series([1,3,6,np.nan,44,1])
四、DataFrame
(1)创建方法一
dates = pd.date_range('20160101',periods=6)
df = pd.DataFrame(np.random.randn(6,4),index=dates,columns=['a','b','c','d'])
(2)创建方法二
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'})
DataFrame是一个表格型的数据结构,它包含有一组有序的列,每列可以是不同的值类型(数值,字符串,布尔值等)。DataFrame既有行索引也有列索引, 它可以被看做由Series组成的大字典。
(3)根据每一个不同的索引来挑选数据, 比如挑选 b 的元素
df['b']
(4)查看数据中的类型
df2.dtypes
(5)查看对列的序号
df2.index
(6)查看每种数据的名称
df2.columns
(7)查看所有DateFrame的值
df2.values
(8)数据的总结
df2.describe()
(9)翻转数据(transpose)
df2.T
(10)对数据的 index 进行排序
df2.sort_index(axis=1, ascending=False)
(11)对数据值排序
df2.sort_values(by='B')
五、选择数据
(1)简单筛选
df['A']
df.A
(2)切片筛选(让选择跨越多行或多列)
df[0:3]
df['20130102':'20130104']
(3)使用标签来选择数据(loc) :
代表所有行
df.loc['20130102']
df.loc[:,['A','B']]
df.loc['20130102',['A','B']]
(4)根据位置进行选择(iloc)
df.iloc[3,1]
df.iloc[3:5,1:3]
df.iloc[[1,3,5],1:3]
(5)混合选择(ix)
df.ix[:3,['A','C']]
(6)通过判断的筛选
df[df.A>8]
六、设置值
(1)根据位置设置(loc 和 iloc)
df.iloc[2,2] = 1111
df.loc['20130101','B'] = 2222
(2)根据条件设置
df.B[df.A>4] = 0
(3)按行或列设置
df['F'] = np.nan
(4)添加数据
df['E'] = pd.Series([1,2,3,4,5,6], index=pd.date_range('20130101',periods=6))
七、处理丢失数据
有时候我们导入或处理数据, 会产生一些空的或者是 NaN 数据,如何删除或者是填补这些 NaN 数据呢?
(1)直接去掉有 NaN 的行或列(dropna)
df.dropna(
axis=0, # 0: 对行进行操作; 1: 对列进行操作
how='any' # 'any': 只要存在 NaN 就 drop 掉; 'all': 必须全部是 NaN 才 drop
)
(2)将 NaN 的值用其他值代替
df.fillna(value=0)
(3)判断是否有缺失数据 NaN ,为 True 表示缺失数据
df.isnull()
(4)检测在数据中是否存在 NaN, 如果存在就返回 True(表格太大不好看)
np.any(df.isnull()) == True
八、Pandas导入导出
pandas可以读取与存取的资料格式有很多种,像csv、excel、json、html与pickle等… 详细请看[官方说明文件](https://pandas.pydata.org/pandas-docs/stable/user_guide/io.html)
(1)读取CSV(excel可以打开)
data = pd.read_csv('student.csv')
(2)将资料存取成pickle
data.to_pickle('student.pickle')
九、Pandas合并
pandas处理多组数据的时候往往会要用到数据的合并处理,使用 concat是一种基本的合并方式.而且concat中有很多参数可以调整,合并成你想要的数据形式。
(1)axis (合并方向)
res = pd.concat([df1, df2, df3], axis=0) #concat纵向合并
(2)ignore_index (重置 index)
res = pd.concat([df1, df2, df3], axis=0, ignore_index=True)
(3)join (合并方式)
#纵向"外"合并df1与df2
res = pd.concat([df1, df2], axis=0, join='outer')
依照column来做纵向合并,有相同的column上下合并在一起,其他独自的column个自成列,原本没有值的位置皆以NaN填充。
#纵向"内"合并df1与df2
res = pd.concat([df1, df2], axis=0, join='inner')
只有相同的column合并在一起,其他的会被抛弃。
(4)join_axes (依照 axes 合并)
#依照`df1.index`进行横向合并
res = pd.concat([df1, df2], axis=1, join_axes=[df1.index])
(5)append (添加数据)
append只有纵向合并,没有横向合并。
res = df1.append(df2, ignore_index=True)
十、Pandas 合并 merge
pandas中的merge和concat类似,但主要是用于两组有key column的数据,统一索引的数据. 通常也被用在Database的处理当中。
(1)依据一组key合并
res = pd.merge(left, right, on='key')
(2)依据两组key合并
res = pd.merge(left, right, on=['key1', 'key2'], how='inner')
res = pd.merge(left, right, on=['key1', 'key2'], how='outer')
res = pd.merge(left, right, on=['key1', 'key2'], how='left') #基于左边
res = pd.merge(left, right, on=['key1', 'key2'], how='right') #基于右边
(3)Indicator
indicator=True会将合并的记录放在新的一列。
res = pd.merge(df1, df2, on='col1', how='outer', indicator=True)
# 自定indicator column的名称
res = pd.merge(df1, df2, on='col1', how='outer', indicator='indicator_column')
(4)依据index合并
res = pd.merge(left, right, left_index=True, right_index=True, how='outer')
(5)解决overlapping的问题 (区分名字相同但内涵不同的问题,比如男生的年龄和女生的年龄)
res = pd.merge(boys, girls, on='k', suffixes=['_boy', '_girl'], how='inner')
十一、Pandas数据可视化
(1)导入模块
import matplotlib.pyplot as plt
(2)Series可视化
# 随机生成1000个数据
data = pd.Series(np.random.randn(1000),index=np.arange(1000))
# 为了方便观看效果, 我们累加这个数据
data.cumsum()
# pandas 数据可以直接观看其可视化形式
data.plot()
plt.show()
(3)Dataframe 可视化
data = pd.DataFrame(
np.random.randn(1000,4),
index=np.arange(1000),
columns=list("ABCD")
)
data.cumsum()
data.plot()
plt.show()
(4)scatter
ax = data.plot.scatter(x='A',y='B',color='DarkBlue',label='Class1')
data.plot.scatter(x='A',y='C',color='LightGreen',label='Class2',ax=ax)
plt.show()