这周有两门考试,还有一篇论文要交,但还是得打卡啊,习题只能做一个了。
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 项之和
- 对 HP, Attack, Defense, Sp. Atk, Sp. Def, Speed 进行加总,验证是否为 Total 值。
- 对于 # 重复的妖怪只保留第一条记录,解决以下问题:
(a) 求第一属性的种类数量和前三多数量对应的种类
(b) 求第一属性和第二属性的组合种类
© 求尚未出现过的属性组合 - 按照下述要求,构造 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)