前面的文件读取、常用基本函数、排序制作了思维导图。
大纲
![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 表示按行操作,理解成逐行提取再处理。
练习
**【练习一】 ***
现有一份关于美剧《权力的游戏》剧本的数据集,请解决以下问题:
(a)在所有的数据中,一共出现了多少人物?
import pandas as pd
import numpy as np
data = pd.read_csv("data/Game_of_Thrones_Script.csv")
data.head(10)
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