前言
pandas的学习开始了。开始学习的肯定是pandas中的基础函数与它们各自的用法,太多了,我们也就提出其中值得注意的点就行。
一、pandas是什么?
series 和 dataframe之间有什么区别呢?
Series是一种类似于一维数组的对象。它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。
obj = pd.Series([4, 7, -5, 3])
print(obj)
'''
0 4
1 7
2 -5
3 3
dtype: int64
'''
DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共同用一个索引)。
obj1 = pd.DataFrame([4, 7, -5, 3])
print(obj1)
'''
0
0 4
1 7
2 -5
3 3
'''
我们常常使用的是DataFrame,因为它能很好地生成行列都有序列的“表格”,这样有助于我们的查看。
1、索引值对齐
这个功能可以通过索引来对对应的数值进行操作,例如:
df1 = pd.DataFrame({'a':[1, 2, 3]}, index=[1, 2, 3])
df2 = pd.DataFrame({'a':[1, 2, 3]}, index=[2, 1, 3])
print(df1-df2)
'''
a
1 -1
2 1
3 0
'''
增加新的列,可以使用assign方法
df = pd.DataFrame({'col1':list('abqeqwedsa'), 'col2':range(5, 15), 'col3':[1, 2, 3, 4, 5, 6, 4, 7, 8, 7]})
df2 = df.assign(col4 = pd.Series(list('qweer')))
print(df2)
'''
col1 col2 col3 col4
0 a 5 1 q
1 b 6 2 w
2 q 7 3 e
3 e 8 4 e
4 q 9 5 r
5 w 10 6 NaN
6 e 11 4 NaN
7 d 12 7 NaN
8 s 13 8 NaN
9 a 14 7 NaN
'''
这里为什么会出现 ‘NaN’ 呢?因为索引值并不对齐,在第四列的单元中,只有前面5个值,没有后面的5个值,所以后面的值智能显示 ‘NaN’。
我们是不是经常能看见head()
这个跟屁虫跟在代码的后面,那这个跟屁虫到底有什么用呢?
如果我们的表格中有大量的数据,每次都将所有的数据都打印出来,是不是很麻烦呢,这时候head()
就来了,它能够只显示前面5行的数据,这样有助于缩小我们的数据量。如果你并不想显示前面5行数据,显示6行,偏偏要多一行,那就在括号里,“看什么?6,你和我,走一波,兄弟”。
df = pd.DataFrame({'col1':list('abqeqwedsa'), 'col2':range(5, 15), 'col3':[1, 2, 3, 4, 5, 6, 4, 7, 8, 7]})
print(df.head(6))
'''
col1 col2 col3
0 a 5 1
1 b 6 2
2 q 7 3
3 e 8 4
4 q 9 5
5 w 10 6
进程已结束,退出代码0
'''
问题和习题
问题
1、Series和DataFrame有哪些常见属性和方法?
2、value_counts会统计缺失值吗?
答:不会,因为这是统计所有元素的个数
3、 如果有多个索引同时取到最大值,idxmax会返回所有这些索引吗?如果不会,那么怎么返回这些索引?
答:不会,他会返回第一个最大值的索引值。
df = pd.DataFrame({'col1':list('abqeqwedsa'), 'col2':range(5, 15), 'col3':[1, 8, 3, 4, 5, 6, 4, 7, 8, 8]})
print(df['col3'].idxmax()) # 1
4、在常用函数一节中,由于一些函数的功能比较简单,因此没有列入,现在将它们列在下面,请分别说明它们的用途并尝试使用。
sum/mean/median/mad/min/max/abs/std/var/quantile/cummax/cumsum/cumprod
答:
sum:求总值
mean:求平均值
median:求中位数
mad:根据平均值计算平均绝对距离差
min:求最小值
max:求最大值
abs:求绝对值
std:求标准差
var:求样本数值的方差
quantile:分位数
cummax:样本的累计最大值
cumsum:累计次数
cumprod:按顺序连乘
5、df.mean(axis=1)是什么意思?它与df.mean()的结果一样吗?问题四提到的函数也有axis参数吗?怎么使用?
答:df.mean(axis=1)计算行的平均值,df.mean()计算列的平均值,axis=0表示列,axis=1表示行,其默认值为0
6、对值进行排序后,相同的值次序由什么决定?
答:多个值排序,即先对第一层排,在第一层相同的情况下对第二层排序。
7、Pandas中为各类基础运算也定义了函数,比如s1.add(s2)表示两个Series相加,但既然已经有了’+’,是不是多此一举?
答:add()包含 fill_value 参数, 可以填充缺失值然后再相加
8、如果DataFrame某一列的元素是numpy数组,那么将其保存到csv在读取后就会变成字符串,怎么解决?
答:df[‘列名’] = df[‘列名’].astype(np.float32)
习题
1、现有一份关于美剧《权力的游戏》剧本的数据集,请解决以下问题:
(a)在所有的数据中,一共出现了多少人物?
(b)以单元格计数(即简单把一个单元格视作一句),谁说了最多的话?
(c)以单词计数,谁说了最多的单词?(不是单句单词最多,是指每人说过单词的总数最多,为了简便,只以空格为单词分界点,不考虑其他情况)
df = pd.read_csv(r'D:\pycharm\学习\joyful-pandas-master\data\Game_of_Thrones_Script.csv')
print(df['Name'].nunique())
print(df['Name'].value_counts().nlargest(1))
'''
564
tyrion lannister 1760
Name: Name, dtype: int64
'''
2、现有一份关于科比的投篮数据集,请解决如下问题:
(a)哪种action_type和combined_shot_type的组合是最多的?
(b)在所有被记录的game_id中,遭遇到最多的opponent是一个支?(由于一场比赛会有许多次投篮,但对阵的对手只有一个,本题相当于问科比和哪个队交锋次数最多)
data = pd.read_csv(
'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())