pandas-task02.md

文件读取和写入

日常经常用到,基本很熟了,平时经常使用的场景是将数据操作后一行行写入文件,用到with open(file,‘a+’) as f1,open () as f2:等等,还有csv.writer用来一行行写入csv文件。
写入markdown 和 latex 第一次知道,不过日常使用频率应该不高。

基本数据结构

Series

Series 一般由四个部分组成,分别是序列的值 data 、索引 index 、存储类型 dtype 、序列的名字 name 。其中,索引也可以指定它的名字,默认为空。

DataFrame

DataFrame 在 Series 的基础上增加了列索引,一个数据框可以由二维的 data 与行列索引来构造。
有index,colums,data等属性。shape可以打印形状。

区别与联系

可以认为DataFrame的每列就是个Series 。

常用基本函数

1.汇总函数

describe和info

info, describe 分别返回表的 信息概况 和表中 数值列对应的主要统计量

2.特征统计函数

常见的有sum, mean, median, var, std, max, min
下面的描述太长不看,总结就是函数计算的是每列对应的非缺失值的函数值。
在显示数据的时候偶然发现了身高这栏有缺失,然后我就好奇那么平均值是怎么算呢。是这行数据全部都去掉还是只是计算身高的时候数量减一?
实践下来发现是后者,这样在平时处理数据的时候就需要注意自己想要的是那种了。因为一般某个属性有缺失值或者不正常的数值的时候我们可能希望把他的其他属性也去除掉,当然也可能会只把不正常属性去掉,看需求。如果是希望整行数据都去掉,下次可以加个判断属性值是否为空。

函数图像
quantile, count, idxmax 这三个函数,它们分别返回的是分位数、非缺失值个数、最大值对应的索引
分位数:所谓四分位数;即把数值由小到大排列并分成四等份,处于三个分割点位置的数值就是四分位数。当p=0.25 0.5 0.75 时,就是在计算四分位数。
idmax()是最大值的索引值,和argmax区别在于argmax需要指定哪一列,适用于series, idmax()会返回每列属性的最大值索引。

3.唯一值函数

这个之前也没用过。
对序列使用 unique 和 nunique 可以分别得到其唯一值组成的列表和唯一值的个数.
drop_duplicates可以观察多列的唯一组合,但是在有空值的时候,该列的空值也会被当成是一个唯一值。
查找空值 df_demo[df_demo.isnull().T.any()]
duplicated 和 drop_duplicates的区别: 功能类似,但前者返回了是否为唯一值的布尔列表,其 keep 参数与后者一致。其返回的序列,把重复元素设为 True ,否则为 False 。 drop_duplicates 等价于把 duplicated 为 True 的对应行剔除。

4.替换函数

替换一般是在指定列中进行的,所以这里都用的series操作,有映射替换、逻辑替换、数值替换。

  1. 映射替换 replace
    replace是映射替换,可以用字典表替换、两个对应的列表替换。
    replace,指定 method 参数为 ffill 则为用前面一个最近的未被替换的值进行替换, bfill 则使用后面最近的未被替换的值进行替换。
  2. 逻辑替换 where/mask
  3. 数值替换 round四舍五入, abs绝对值, clip截断

5.apply方法

常用于行迭代或者列迭代,好处是可以自定义方法,自由度很高。缺点是相对于自带的方法性能可能有些下降
新的写法

 df_demo.apply(lambda x:x.mean(), axis=1).head()

练习

Ex1:口袋妖怪数据集

在这里插入图片描述

1.对 HP, Attack, Defense, Sp. Atk, Sp. Def, Speed 进行加总,验证是否为 Total 值。

#我的方法 先求得每只宝可梦的累计值 再将所有宝可梦的累计值求和 和表格中total的求和值对比 
df2_total=df[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']].sum(axis=1).sum()
print(df2_total==df['Total'].sum())
#答案方法 将每只宝可梦的累计值和对应total对比 得到一个true/false的series 再求其平均值 
print((df[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']].sum(1)==df['Total']).mean())

2.对于 # 重复的妖怪只保留第一条记录,解决以下问题:

  1. .求第一属性的种类数量和前三多数量对应的种类
# 去重 保留第一个
df_dropdup=df.drop_duplicates('#', keep='first')
df_dropdup['Type 1'].value_counts()[:3]
  1. 求第一属性和第二属性的组合种类
df_dropdup.drop_duplicates(['Type 1','Type 2'], keep='first')
#共有143个组合
  1. 求尚未出现过的属性组合
    这个刚开始没看懂题目。。。todolist()作用是type2 存在空的情况,组合的时候需要考虑到这一点
L_full = [i+' '+j for i in df['Type 1'].unique() for j in (df['Type 1'].unique().tolist() + [''])]
L_part = [i+' '+j for i, j in zip(df['Type 1'], df['Type 2'].replace(np.nan, ''))]
res = set(L_full).difference(set(L_part))
len(res) 

3.按照下述要求,构造 Series :

  1. 取出物攻,超过120的替换为 high ,不足50的替换为 low ,否则设为 mid
    这个很常规
df['Attack'].mask(df['Attack']>120, 'high'
                 ).mask(df['Attack']<50, 'low'
                 ).mask((50<=df['Attack']
                 )&(df['Attack']<=120), 'mid')
  1. 取出第一属性,分别用 replace 和 apply 替换所有字母为大写
#replace
df['Type 1'].replace({i:str.upper(i) for i in df['Type 1' ].unique()}).head()

#apply
def str_upper(X):
    return(X.upper())
df['Type 1'].apply(str_upper).head()

#或者使用lamba
df['Type 1'].apply(lambda x:str.upper(x)).head()
  1. 求每个妖怪六项能力的离差,即所有能力中偏离中位数最大的值,添加到 df 并从大到小排序
    这个有点难度,看了答案才会
df['Deviation'] = df[['HP', 'Attack', 'Defense', 'Sp. Atk',
                      'Sp. Def', 'Speed']].apply(lambda x:
                       np.max((x-x.median()).abs()), 1)
df.sort_values('Deviation', ascending=False).head()

Ex2:指数加权窗口

1. 请用 expanding 窗口实现

np.random.seed(0)
s = pd.Series(np.random.randint(-1,2,30).cumsum())
s.ewm(alpha=0.2).mean().head()

def ewm_func(x, alpha=0.2):
    win = (1-alpha)**np.arange(x.shape[0])[::-1]
    res = (win*x).sum()/win.sum()
    return res

s.expanding().apply(ewm_func).head()

2.作为滑动窗口的 ewm 窗口

从第1问中可以看到, ewm 作为一种扩张窗口的特例,只能从序列的第一个元素开始加权。现在希望给定一个限制窗口 n ,只对包含自身的最近的 n 个元素作为窗口进行滑动加权平滑。请根据滑窗函数,给出新的 w 与 y 的更新公式,并通过 rolling 窗口实现这一功能。

s.rolling(window=4).apply(ewm_func).head()
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值