Pandas学习笔记之二——Pandas基础

仅以此文记录我的Pandas学习过程,今天分享的是Pandas基础部分,欢迎大家交流。
Pandas基础部分主要包括文件的读取和写入、基本数据结构、常用基本函数、窗口对象以及最后的练习部分。当然学习前还是熟悉的装库环节,其中要求xlrd不高于2.0.0,通过pip来安装即可

一、基本数据结构

pandas有两种基本数据结构,包括存储一维的values的Series和存储二维values的DataFrame。
1.Series
Series 一般由四个部分组成,分别是序列的值 data 、索引 index 、存储类型 dtype 、序列的名字 name 。其中,索引也可以指定它的名字,默认为空。
例子:

s = pd.Series(data = [100, 'a', {'dic1':5}],
              index = pd.Index(['id1', 20, 'third'], name='my_idx'),
              dtype = 'object',
              name = 'my_name')
print(s)

输出结果:

my_idx
id1              100
20                 a
third    {'dic1': 5}
Name: my_name, dtype: object

存储类型对应的object是一种混合类型,包括多种数据结构。
这些属性也可以用 .的方式来获取。
2.DataFrame
因为DataFrame是二维的,所以它比Series多了一个列索引,一个数据框可以由二维的data和行列索引来构造:

df = pd.DataFrame(data = [[1, 'a', 1.2], [2, 'b', 2.2], [3, 'c', 3.2]],
                  index = ['row_%d'%i for i in range(3)],                  
                  columns=['col_0', 'col_1', 'col_2'])

输出二维表:

       col_0 col_1  col_2
row_0      1     a    1.2
row_1      2     b    2.2
row_2      3     c    3.2

也可以从列索引名到数据的映射来构造数据框,同时在加上行索引:

df = pd.DataFrame(data = {'col_0': [1,2,3], 'col_1':list('abc'),
                          'col_2': [1.2, 2.2, 3.2]},
                  index = ['row_%d'%i for i in range(3)])

输出结果同上
与Series相似,在数据框中同样可以取出相应的属性也用 . 来表示

二、常用基本函数

1.汇总函数
head,tail分别表示返回表或序列的前n行和后n行
info, describe分别返回表的信息概况和表中数值列对应的主要统计量。
以describe为例:

df = pd.read_csv('C:/Users/lz/Desktop/stock_px.csv')
print(df.describe())

输出为:

              AAPL         MSFT          XOM          SPX
count  2214.000000  2214.000000  2214.000000  2214.000000
mean    125.516147    23.945452    59.558744  1183.773311
std     107.394693     3.255198    16.725025   180.983466
min       6.560000    14.330000    26.210000   676.530000
25%      37.135000    21.700000    49.492500  1077.060000
50%      91.455000    24.000000    62.970000  1189.260000
75%     185.605000    26.280000    72.510000  1306.057500
max     422.000000    34.070000    87.480000  1565.150000

2.特征统计函数
最常见的是sum,mean,median,var,std,max,min,quantile(分位数),count(非缺失值个数),idxmax(最大值对应的索引)
以quantile为例:

df = pd.read_csv('C:/Users/lz/Desktop/joyful-pandas-master/data/learn_pandas.csv')

df_demo = df[['Height', 'Weight']]
print(df_demo.quantile(0.75))

结果:

Height    167.5
Weight     65.0
Name: 0.75, dtype: float64

3.唯一值函数
对序列使用unique和nunique可以得到其唯一值组成的列表和唯一值的个数。value_counts可以得到唯一值和其对应出现的频数。要查看多个组合的唯一值,可以使用 drop_duplicates 。其中的关键参数是 keep ,默认值 first 表示每个组合保留第一次出现的所在行, last 表示保留最后一次出现的所在行, False 表示把所有重复组合所在的行剔除。
例如:

ddf = pd.read_csv('C:/Users/lz/Desktop/joyful-pandas-master/data/learn_pandas.csv')

df_demo = df[['Gender','Transfer','Name']]
last = df_demo.drop_duplicates(['Gender', 'Transfer'],keep = 'last')
print(last)

结果为:

     Gender Transfer            Name
147    Male      NaN        Juan You
150    Male        Y   Chengpeng You
169  Female        Y   Chengquan Qin
194  Female      NaN     Yanmei Qian
197  Female        N  Chengqiang Chu
199    Male        N     Chunpeng Lv

duplicated 和drop_duplicates功能类似,但前者会返回是否为唯一值的布尔列表,keep参数一样。
例如:

df = pd.read_csv('C:/Users/lz/Desktop/joyful-pandas-master/data/learn_pandas.csv')

df_demo = df[['Gender','Transfer','Name']]
duplicated = df_demo.duplicated(['Gender', 'Transfer']).head()
print(duplicated)

结果为:

0    False
1    False
2     True
3     True
4     True
dtype: bool

4.替换函数
一般而言替换是针对某一列进行,pandas中的替换函数分为三类:映射替换、逻辑替换、数值替换。
映射替换方法包括replace方法,str.replace方法和cat.codes方法。此处介绍replace方法。
在replace中,可以通过字典构造,或者传入两个列表进行替换:

df = pd.read_csv('C:/Users/lz/Desktop/joyful-pandas-master/data/learn_pandas.csv')

df_demo = df[['Gender','Transfer','Name']]
re = df['Gender'].replace({'Female':0, 'Male':1}).head()
print(re)

结果为:

0    0
1    1
2    1
3    0
4    1
Name: Gender, dtype: int64

还有一种特殊的方向替换,指定 method 参数为 ffill 则为用前面一个最近的未被替换的值进行替换, bfill 则使用后面最近的未被替换的值进行替换。通过下例可以发现不同:

s = pd.Series(['a', 1, 'b', 2, 1, 1, 'a'])
ys1 = s.replace([1, 2], method='ffill')
print(ys1)
ys2 = s.replace([1, 2], method='bfill')
print(ys2)

结果为:

0    a
1    a
2    b
3    b
4    b
5    b
6    a
dtype: object
0    a
1    b
2    b
3    a
4    a
5    a
6    a
dtype: object

逻辑替换包括 where 和 mask ,这两个函数是完全对称的: where 函数在传入条件为 False 的对应行进行替换,而 mask 在传入条件为 True 的对应行进行替换,当不指定替换值时,替换为缺失值。

s = pd.Series([-1, 1.2345, 100, -50])
bw = s.where(s<0)
print(bw)
bm = s.mask(s<0)
print(bm)

结果为:

0    -1.0
1     NaN
2     NaN
3   -50.0
dtype: float64
0         NaN
1      1.2345
2    100.0000
3         NaN
dtype: float64

数值替换包含round,abs,clip,方法,他们分别表示按照给定精度四舍五入、取绝对值和截断。
5.排序函数
排序共有两种方式:值排序和索引排序,对应函数为sort_values 和 sort_index。其中默认参数ascending=True为升序。索引排序时若要指定索引层的名字或层号用参数level表示。
6.apply方法
apply方法常用于DataFrame的行迭代或者列迭代,apply的参数往往是一个以序列为输入的函数。例如对于.mean(),使用apply可以如下地写出:

df = pd.read_csv('C:/Users/lz/Desktop/joyful-pandas-master/data/learn_pandas.csv')

df_demo = df[['Height', 'Weight']]

def my_mean(x):
    res = x.mean()
    return res
app = df_demo.apply(my_mean)
print(app)

结果为:

Height    163.218033
Weight     55.015873
dtype: float64

三、窗口对象

pandas有3类窗口,分别是滑动窗口rolling、扩张窗口expanding以及指数加权窗口ewm。
1.滑窗对象
要使用滑窗函数,就必须先要对一个序列使用 .rolling 得到滑窗对象,其最重要的参数为窗口大小 window 。
代码如下:

s = pd.Series([1, 2, 3, 4, 5])
roller = s.rolling(window = 3)
print(roller)

结果:

Rolling [window=3,center=False,axis=0]

在得到了滑窗对象后,能够使用相应的聚合函数进行计算,需要注意的是窗口包含当前行所在的元素。对于滑动相关系数或滑动协方差的计算,可以如下写出:

s = pd.Series([1,2,3,4,5])
roller = s.rolling(window = 3)
s1 = pd.Series([1, 2, 6, 16, 30])
cov = roller.cov(s1)
corr = roller.corr(s1)
print(cov,corr)

结果如下:

0     NaN
1     NaN
2     2.5
3     7.0
4    12.0
dtype: float64 0         NaN
1         NaN
2    0.944911
3    0.970725
4    0.995402
dtype: float64

shift, diff, pct_change 是一组类滑窗函数,它们的公共参数为 periods=n ,默认为1,分别表示取向前第 n 个元素的值、与向前第 n 个元素做差(与 Numpy 中不同,后者表示 n 阶差分)、与向前第 n 个元素相比计算增长率。这里的 n 可以为负,表示反方向的类似操作。

s = pd.Series([1,3,6,10,15])
ss = s.shift(2)#滑窗2格
print(ss)

结果为:

0    NaN
1    NaN
2    1.0
3    3.0
4    6.0
dtype: float64

将其视作类滑窗函数的原因是,它们的功能可以用窗口大小为 n+1 的 rolling 方法等价代替。
2.扩张窗口
可以理解为一个动态长度的窗口,其窗口的大小就是从序列开始处到具体操作的对应位置,其使用的聚合函数会作用于这些逐步扩张的窗口上。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值