Task01 pandas基础 学习笔记

前面的文件读取、常用基本函数、排序制作了思维导图。

大纲

![U1 pandas基础](C:UserszhangcDesktopU1 pandas基础.png)

五、问题与练习

【问题一】 Series和DataFrame有哪些常见属性和方法?

# Series属性
s.values #values index dtype name属性在声明、访问时可使用
# Series方法
s.to_frame()	# 将Series数据转换成DataFrame格式

## DataFrame属性
df.shape	# shape index columns values属性常用
## DataFrame方法
df.rename(index={}, columns={}) # 关键字参数改行、列名
df.info()	# df.describe() 返回数据信息
df.drop(index="xx", columns="xx")	#删除指定行、列内容,默认原数据不改动,inplace=True则该
# del  pop
# assign方法增新列
df.select_dtype() # 
df.set_index()
df.sort_index()
df['Math'].unique()	# 唯一值
## count() idxmax() apply()等等太多了

查看官方文档、或者help()及时查阅

【问题二】 value_counts会统计缺失值吗?

# 上文提到了counts() 统计非缺失元素的个数
# value_counts()并不统计非缺失数据个数
df = pd.DataFrame(np.arange(12).reshape(4,3), columns=['one','two','three'], index=[1,2,3,4])
df = df.replace({'three':{8:float('nan')}})
df
Unnamed: 0	one	two	three
0	1	0	1	2.0
1	2	3	4	5.0
2	3	6	7	NaN
3	4	9	10	11.0

df['three'].value_counts()
11.0    1
5.0     1
2.0     1
Name: three, dtype: int64

【问题三】 与idxmax和nlargest功能相反的是哪两组函数?

idxmax, idxmin;

nlargest, nsmallest;

【问题四】 在常用函数一节中,由于一些函数的功能比较简单,因此没有列入,现在将它们列在下面,请分别说明它们的用途并尝试使用。

sum/mean/median/mad/min/max/abs/std/var/quantile/cummax/cumsum/cumprod

sum/mean/median/min/max/abs/std/var/quantile是常见的统计方法
mad
cummax/cumsum/cumprod 为累计最大值,累计和,累计积

df = pd.DataFrame(np.arange(12).reshape(4,3), columns=['one','two','three'], index=[1,2,3,4])
df
one	two	three
1	0	1	2
2	3	4	5
3	6	7	8
4	9	10	11

df.mad()
one      3.0
two      3.0
three    3.0
dtype: float64

df.cumsum() #看到这里是按列,一行行累加和的
one	two	three
1	0	1	2
2	3	5	7
3	9	12	15
4	18	22	26

【问题五】 df.mean(axis=1)是什么意思?它与df.mean()的结果一样吗?第一问提到的函数也有axis参数吗?怎么使用?

他们是不一样的。一般函数默认axis=0,表示按操作;

axis=1 表示按操作,理解成逐行提取再处理。

img

练习

**【练习一】 ***

现有一份关于美剧《权力的游戏》剧本的数据集,请解决以下问题:
(a)在所有的数据中,一共出现了多少人物?

import pandas as pd
import numpy as np
data = pd.read_csv("data/Game_of_Thrones_Script.csv")
data.head(10)

image-20200420105733863

print("出现人物数量:%d" %(data['Name'].nunique() ))
# 564

(b)以单元格计数(即简单把一个单元格视作一句),谁说了最多的话?

print("谁说了最多话")
# data.set_index(['Name','Sentence']).value_counts() #错误
data['Name'].value_counts().index[0]
# 'tyrion lannister'

应该理解成,数据里面一行为一个人说的一句话,所以,统计Name出现次数即可。

(c)以单词计数,谁说了最多的单词?

# (c)以单词计数,谁说了最多的单词?

# 每行数据中,Sentence中有几个单词 .assign()  #pd.Series( )
words_count = data['Sentence'].apply( lambda x:len(x.split(sep=' ')) ) #已结是Series了
data_with_word_num = data.assign(Words=words_count).sort_values(by='Name')
data_with_word_num
# 同一Name 的单次数量加一起, 排序
new_data = list(zip(data_with_word_num['Name'], data_with_word_num['Words']) )
## 数据里面包的元组 ,sort方法无法使用

### 抽取里面的数量, 对其排序,
# 这里我看了参考答案,:只抽取数量,按照原list顺序存放
L_count = []
for i in new_data:
    if i == new_data[0]:
        L_count.append(i[1])
        last = i[0] #暂存第一个单词
    else:
        L_count.append(L_count[-1]+i[1] if i[0]==last else i[1])
        ##终于理解了:对数据排序后,相同单词是前后放一起的,那就可以累加
        last = i[0]
# len(L_count)
data_with_word_num['Count'] = L_count
data_with_word_num['Name'][data_with_word_num['Count'].idxmax()]

作者也是个人才,七搞八搞的,
思路:既然不太好直接排序,将name 单词数量 抽出来,相同名字的单词数量累加。
这里的“累加” 保证了list的原长度。在计算结束后,将Count写入到DataFrame中。

最后,读取最大的数据即可。

【练习二】

现有一份关于科比的投篮数据集,请解决如下问题:

kb = pd.read_csv('data/Kobe_data.csv',index_col='shot_id')
kb.head()

(a)哪种action_type和combined_shot_type的组合是最多的?

# 怎么将他们组合起来,然后要计数统计出现次数 -->> zip

pd.Series( list(zip(kb['action_type'],kb['combined_shot_type'])) ).value_counts().index[0]
# ('Jump Shot', 'Jump Shot')

(b)在所有被记录的game_id中,遭遇到最多的opponent是一个支?

d = {}
for i in kb['game_id']:
    d[i]=kb[kb['game_id']==i]['opponent'].unique()

d_count = pd.DataFrame(d.values())[0].value_counts()
d_count.nlargest()
# SAS    91

最后一题是在网上找的参考,先将关系写入字典,然后转换为DF格式,统计值的数量,最后可以输出最大值了。

参考

DataFrame — pandas 1.0.3 documentation
https://pandas.pydata.org/pandas-docs/stable/reference/frame.html

joyful-pandas: Pandas中文教程
https://github.com/datawhalechina/joyful-pandas

原文地址:https://www.cnblogs.com/achenger/p/12771921.html