《利用Python进行数据分析·第2版》第五章笔记


pandas两个主要数据结构:Series和DataFrame
Series是一种类似于一维数组的对象 obj = pd.Series([4, 7, -5, 3])
DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)

del frame[‘LieMing’] #删除列

2种方法创建frame
1,data = {‘state’: [‘Ohio’, ‘Ohio’, ‘Ohio’, ‘Nevada’, ‘Nevada’, ‘Nevada’],
‘year’: [2000, 2001, 2002, 2001, 2002, 2003],
‘pop’: [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame2 = pd.DataFrame(data, columns=[‘year’, ‘state’, ‘pop’, ‘debt’],
…: index=[‘one’, ‘two’, ‘three’, ‘four’,
…: ‘five’, ‘six’])
2,pop = {‘Nevada’: {2001: 2.4, 2002: 2.9},
…: ‘Ohio’: {2000: 1.5, 2001: 1.7, 2002: 3.6}}
frame3 = pd.DataFrame(pop)

索引对象
labels = pd.Index(np.arange(3)) #索引可以重复利用
obj2 = pd.Series([1.5, -2.5, 0], index=labels)
obj2.index is labels

pandas的Index可以包含重复的标签

二、基本功能
1,重新索引
obj2 = obj.reindex([‘a’, ‘b’, ‘c’, ‘d’, ‘e’]) #生成新对象,不修改原数据
obj3.reindex(range(6), method=‘ffill’) #ffill向前填充
2,丢弃指定轴上的项
obj = pd.Series(np.arange(5.), index=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’])
new_obj = obj.drop(‘c’) #生成新对象,不修改原数据
data.drop(‘two’, axis=1) #通过传递axis=1或axis='columns’可以删除列的值
data.drop([‘two’, ‘four’], axis=‘columns’) #通过传递axis=1或axis='columns’可以删除列的值
obj.drop(‘c’, inplace=True) #直接修改原对象
3,索引、选取和过滤
Serise
obj = pd.Series(np.arange(4.), index=[‘a’, ‘b’, ‘c’, ‘d’])
obj[‘b’]#直接通过index名选取
obj[1]#index编号选取
obj[2:4]#index编号切片选取
obj[[‘b’, ‘a’, ‘d’]]#index名选取多个
obj[[1, 3]]#index编号选取多个
obj[obj < 2]#数据逻辑筛选
obj[‘b’:‘c’]#利用标签的切片运算与普通的Python切片运算不同,其末端是包含的
DataFrame
data = pd.DataFrame(np.arange(16).reshape((4, 4)),
…: index=[‘Ohio’, ‘Colorado’, ‘Utah’, ‘New York’],
…: columns=[‘one’, ‘two’, ‘three’, ‘four’])
data[‘two’] #选取列
data[[‘three’,‘one’]]#选取多列
data[data[‘three’] > 5] #选取行
data[:2] #选取行
data[data < 5] = 0 #选取符合逻辑的元素直接赋值
4,用loc和iloc进行选取
data.loc[‘Colorado’, [‘two’, ‘three’]] #通过标签选择一行和多列
data.iloc[2, [3, 0, 1]]#iloc和整数进行选取
data.iloc[2]
data.iloc[[1, 2], [3, 0, 1]]
data.loc[:‘Utah’, ‘two’]
data.iloc[:, :3][data.three > 5]
5,整数索引
ser = pd.Series(np.arange(3.))
In [147]: ser[:1]
Out[147]:
0 0.0
dtype: float64 #如果轴索引含有整数,数据选取总会使用标签。为了更准确,请使用loc(标签)或iloc(整数)
In [148]: ser.loc[:1]
Out[148]:
0 0.0
1 1.0
dtype: float64 #如果轴索引含有整数,数据选取总会使用标签。为了更准确,请使用loc(标签)或iloc(整数)
6,算术运算和数据对齐
pandas最重要的一个功能是,它可以对不同索引的对象进行算术运算。在将对象相加时,如果存在不同的索引对,则结果的索引就是该索引对的并集。对于有数据库经验的用户,这就像在索引标签上进行自动外连接
7,在算术方法中填充值
df1.add(df2, fill_value=0) #不会出现NaN,以0填充
1 / df1 #与下句相等
df1.rdiv(1)#与上句相等
加减乘除另有对应方法,详查表
8,DataFrame和Series之间的运算
arr = np.arange(12.).reshape((3, 4))
arr - arr[0] #当我们从arr减去arr[0],每一行都会执行这个操作。这就叫做广播(broadcasting)
DataFrame 广播运算详细查看文档
9,函数应用和映射
np.abs(frame) #取绝对值,生成新对象,不修改原对象
f = lambda x: x.max() - x.min()
frame.apply(f) #将函数应用到由各列或行所形成的一维数组上.这里的函数f,计算了一个Series的最大值和最小值的差,在frame的每列都执行了一次。结果是一个Series,使用frame的列作为索引
frame.apply(f, axis=‘columns’) #传递axis='columns’到apply,这个函数会在每行执行
def f(x): return pd.Series([x.min(), x.max()], index=[‘min’, ‘max’])
frame.apply(f) #传递到apply的函数不是必须返回一个标量,还可以返回由多个值组成的Series
format = lambda x: “%.2f” % x #python格式化字符时,“格式” % 变量
frame.applymap(format) #全局格式化,注意方法名是applymap()
frame[‘e’].map(format) #应用元素级函数的map方法
10,排序和排名
obj = pd.Series(range(4), index=[‘d’, ‘a’, ‘b’, ‘c’])
obj.sort_index() #字母也可以排序
frame = pd.DataFrame(np.arange(8).reshape((2, 4)),
…: index=[‘three’, ‘one’],
…: columns=[‘d’, ‘a’, ‘b’, ‘c’])
frame.sort_index()
frame.sort_index(axis=1)
frame.sort_index(axis=1, ascending=False) #倒序
obj = pd.Series([4, 7, -3, 2])
obj.sort_values() #对元素排序,缺失值默认都是放到series的末尾
frame = pd.DataFrame({‘b’: [4, 7, -3, 2], ‘a’: [0, 1, 0, 1]})
frame.sort_values(by=‘b’) #df对元素排序
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj.rank()#返回值为排名序号,通过“为各组分配一个平均排名”的方式破坏平级关系,
obj.rank(method=‘first’)#根据值在原数据中出现的顺序给出排名
obj.rank(ascending=False, method=‘max’) 按降序进行排名
frame.rank(axis=‘columns’)#df排名方式(按行)
排名时用于破坏平级关系的方法详细见表
11,带有重复标签的轴索引
对于带有重复值的索引,数据选取的行为将会有些不同。如果某个索引对应多个值,则返回一个Series;而对应单个值的,则返回一个标量值
DF数据同理
三、汇总和计算描述统计
1,一般统计
df.sum()#返回一个含有列的和的Series
df.sum(axis=1) #传入axis='columns’或axis=1将会按行进行求和运算
df.mean(axis=‘columns’,skipna=False) #NA值会自动被排除,除非整个切片(这里指的是行或列)都是NA。通过skipna选项可以禁用该功能
df.idxmax()#(如idxmin和idxmax)返回的是间接统计(比如达到最小值或最大值的索引)
df.cumsum() #累计型
df.describe() #一次性产生多个汇总统计,数值型,非数值型都有对应统计
描述和统计相关方法具体查表
2,相关系数与协方差
pandas-datareader包安装问题,先跳过
3,唯一值、值计数以及成员资格
obj = pd.Series([‘c’, ‘a’, ‘d’, ‘a’, ‘a’, ‘b’, ‘b’, ‘c’, ‘c’])
uniques = obj.unique() #可以得到Series中的唯一值数组
obj.value_counts() #用于计算一个Series中各值出现的频率
pd.value_counts(obj.values, sort=False)#value_counts还是一个顶级pandas方法,可用于任何数组或序列
mask = obj.isin([‘b’,‘c’]) #isin用于判断矢量化集合的成员资格,可用于过滤Series中或DataFrame列中数据的子集
to_match = pd.Series([‘c’, ‘a’, ‘b’, ‘b’, ‘c’, ‘a’])
unique_vals = pd.Series([‘c’, ‘b’, ‘a’])
pd.Index(unique_vals).get_indexer(to_match)
array([0, 2, 1, 1, 0, 2]) #与isin类似的是Index.get_indexer方法,它可以给你一个索引数组,从可能包含重复值的数组到另一个不同值的数组

感想

学了3个多小时,排版也不想排了TAT

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值