pandas学习笔记2

这周有两门考试,还有一篇论文要交,但还是得打卡啊,习题只能做一个了。

Reference:学习文档:https://github.com/datawhalechina/joyful-pandas

1、pandas读取文件
在这里插入图片描述

以读取csv文件为例,发现电脑上有西瓜数据集就顺手用了。其他文件的读取类似不在举例子。

import  pandas as pd


res = pd.read_csv('E:\\learn python\\Machine Learning\\3.0a.csv')
print(res)

结果
在这里插入图片描述
TipS:
header=None 表示不读取第一行忽略第一行,第一行通常是标题拿uci数据集为例。
用法:这样写pd.read_csv('E:\\learn python\\Machine Learning\\3.0a.csv',heard=None)
index_col 把某一列作为索引
usecols 把某列单独拿出来
parse_dates 学习文档给出的是表示把某列转化为时间(以前没用过)效果见下图。
在这里插入图片描述
nrows=2 表示读取数据集的前两行

二、基本的数据结构

pandas有两种基本的数据存储结构,存储一维用 Series ,二维用 DataFrame 。下边分别介绍

series
由四个部分组成,data, index , dtype , name 。 各个部分的含义看英文的命名基本就能了解大概。上个代码。


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

              )
print(s)
"""
my_idx
idl              100
20                 a
third    {'dict': 5}
Name: my_name, dtype: object
"""

DataFrame

与Series不同的是增加了列索引,即 columns,上个代码。

data = [[1, 'a', 1.2], [2, 'b', 2.2], [3, 'c', 3.2]]

df = pd.DataFrame(data=data,
                  index=  ['row_%d'%i for i in range(3)],
                    columns=['col_0', 'col_1', 'col_2']
                  )

print(df)
"""
       col_0 col_1  col_2
row_0      1     a    1.2
row_1      2     b    2.2
row_2      3     c    3.2
"""

三、常用基本函数

1、head, tail 函数分别表示返回表或者序列的前 n 行和后 n 行,其中 n 默认为 5
在这里插入图片描述

2、info, describe 分别返回表的 信息概况和表中 数值列对应的主要统计量
在这里插入图片描述

3、唯一值函数 unique 和 nunique 可以分别得到其唯一值组成的列表和唯一值的个数

res = pd.read_csv('E:\\learn python\\numpy&pandas\\learn_pandas.csv')
res = res[res.columns[:7]]
res['School'].unique()
print(res)

value_counts 可以得到唯一值和其对应出现的频数,用法类似。
在这里插入图片描述
替换函数 replace 可以通过字典的构造,来替换

res ['Gender'].replace({'Female':0, 'Male':1}).head()

res ['Gender'].replace(['Female', 'Male'], [0, 1]).head()

排序函数
排序分为值排序和索引排序,分别对应的方法是 sort _values 和sort_index ,这里就不上代码啦用法与上面类似,直接上图吧。
在这里插入图片描述
在这里插入图片描述
apply 方法 感觉这个很有用 !apply 方法常用于 DataFrame 的行迭代或者列迭代 ,上个代码。

re = res[['Height', 'Weight']]
def my_mean(x):
    res = x.mean()
    return res

print(re .apply(my_mean))

"""
Height    163.218033
Weight     55.015873
dtype: float64

"""

也可以通过匿名函数的方式使其更加简洁,简单一行就搞定。

re.apply(lambda x:x.mean())

四、滑窗对象
参考:https://blog.csdn.net/jasminefeng/article/details/111238976
这部分内容没有用到过,对一个一维的数组用.rolling的得到一个滑窗对象,参数window指定窗口的大小。

s = pd.Series([1,2,3,4,5])

roller = s.rolling(window=3)
print(roller)#Rolling [window=3,center=False,axis=0]
print(roller.mean())
"""
0    NaN
1    NaN
2    2.0
3    3.0
4    4.0
dtype: float64
"""

在这里插入图片描述

五、练习题

现有一份口袋妖怪的数据集,下面进行一些背景说明:
• # 代表全国图鉴编号,不同行存在相同数字则表示为该妖怪的不同状态
• 妖怪具有单属性和双属性两种,对于单属性的妖怪,Type 2 为缺失值
• Total, HP, Attack, Defense, Sp. Atk, Sp. Def, Speed 分别代表种族值、体力、物攻、防御、特攻、特
防、速度,其中种族值为后 6 项之和

在这里插入图片描述

  1. 对 HP, Attack, Defense, Sp. Atk, Sp. Def, Speed 进行加总,验证是否为 Total 值。
  2. 对于 # 重复的妖怪只保留第一条记录,解决以下问题:
    (a) 求第一属性的种类数量和前三多数量对应的种类
    (b) 求第一属性和第二属性的组合种类
    © 求尚未出现过的属性组合
  3. 按照下述要求,构造 Series :
    (a) 取出物攻,超过 120 的替换为 high ,不足 50 的替换为 low ,否则设为 mid
    (b) 取出第一属性,分别用 replace 和 apply 替换所有字母为大写
    © 求每个妖怪六项能力的离差,即所有能力中偏离中位数最大的值,添加到 df 并从大到小排序

解:1、大体思路很简单,就是提取出来,再求和、再验证。上个代码

res = pd.read_csv('E:\\learn python\\numpy&pandas\\pokemon.csv')

if_true = (res[['HP', 'Attack', 'Defense', 'Sp. Atk', 'Sp. Def', 'Speed']])
if_true = if_true.sum(1)
#print(if_true)
"""
0      318
1      405
2      525
3      625
4      309
......... 
"""
a = (if_true != res['Total']).mean()
print(a)

"""
0.0
"""

2、
(a)

res = pd.read_csv('E:\\learn python\\numpy&pandas\\pokemon.csv')
dp_dup = res.drop_duplicates('#', keep='first')###删除重复,除了第一次出现
#print(dp_dup)
dp_dup = dp_dup['Type 1'].nunique()
print(dp_dup)###18

(b)

dp_dup = res.drop_duplicates('#', keep='first')###删除重复,除了第一种类出现
# #print(dp_dup)
#
# dp_dup = dp_dup['Type 1'].nunique()
# #print(dp_dup)###18

attr_dup = dp_dup.drop_duplicates(['Type 1', 'Type 2'])
#print(attr_dup)
res = attr_dup.shape[0]
print(res)##143

(c)(哈哈哈哈哈)我菜鸡,没思路,看答案。

在这里插入图片描述
3、
(a)

df = pd.read_csv('E:\\learn python\\numpy&pandas\\pokemon.csv')

res = df['Attack'].mask(df['Attack'] > 120, 'high'
                        ).mask(df['Attack']<50, 'low').mask((50<=df['Attack']
                                                )&(df['Attack']<=120), 'mid')

print(res)
"""
0    low
1    mid
2    mid
3    mid
4    mid
.........
Name: Attack, dtype: object
"""

(b)

res = df['Type 1'].apply(lambda x:str.upper(x)).head()
print(res)

"""
0    GRASS
1    GRASS
2    GRASS
3    GRASS
4     FIRE
Name: Type 1, dtype: object

"""

a =  df['Type 1'].replace({i:str.upper(i) for i in df['Type 1']}).head()
print(a)

©
看的参考答案,我是渣渣

df['Deviation'] = df[['HP', 'Attack', 'Defense', 'Sp. Atk',
                        'Sp. Def', 'Speed']].apply(lambda x:np.max(
                                                (x-x.median()).abs()), 1)



res = df.sort_values('Deviation', ascending=False).head()

print(res)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值