第1关:Pandas数值运算方法

任务描述

本关任务:获取鸢尾花数据集前30行并转换成DataFrame,然后让每一行都减去第一行的值,输出运算后的结果。

相关知识

Pandas在数值运算方面继承了NumPy的通用函数等功能,实现了一些高效技巧。

通用函数:保留索引

因为Pandas是建立在NumPy基础之上的,所以NumPy的通用函数同样适用于PandasSeriesDataFrame对象。

  1. import numpy as np
  2. import pandas as pd
  3. rng = np.random.RandomState(42) #创建随机数种子
  4. ser = pd.Series(rng.randint(0,10,4))
  5. df = pd.DataFrame(rng.randint(0,10,(3,4)), columns=['A','B','C','D'])
  6. # 对Series对象使用Numpy通用函数,生成的结果是另一个保留索引的Pands对象
  7. print(np.exp(ser))
  8. Out:0 403.428793
  9. 1 20.085537
  10. 2 1096.633158
  11. 3 54.598150
  12. dtype: float64
  13. # 对DataFrame使用Numpy通用函数
  14. print(np.sin(df*np.pi/4))
  15. Out:
  16. A B C D
  17. 0 -1.000000 7.071068e-01 1.000000 -1.000000e+00
  18. 1 -0.707107 1.224647e-16 0.707107 -7.071068e-01
  19. 2 -0.707107 1.000000e+00 -0.707107 1.224647e-16
通用函数:索引对齐
Series索引对齐

假如你要整合两个数据源的数据,其中一个是美国面积最大的三个州的面积数据,另一个是美国人口最多的三个州的人口数据:

  1. # 面积
  2. area=pd.Series({'Alaska':1723337,'Texas':695662,'California':423967},name='area')
  3. # 人口
  4. population=pd.Series({'California':38332521,'Texas':26448193,'New York': 19651127}, name='population'})

人口除以面积的结果:

  1. print(population/area)
  2. Out:
  3. Alaska NaN
  4. California 90.413926
  5. New York NaN
  6. Texas 38.018740
  7. dtype: float64

对于缺失的数据,Pandas会用NaN填充,表示空值。这是Pandas表示缺失值的方法(后面的关卡会介绍)。这种索引对齐方式是通过Python内置的集合运算规则实现的,任何缺失值默认都用NaN填充。

DataFrame索引对齐

在计算两个DataFrame时,类似的索引对齐规则也同样会出现在共同列中:

  1. A = pd.DataFrame(rng.randint(0, 20, (2, 2)), columns=list('AB'))
  2. """
  3. A:
  4. A B
  5. 0 1 11
  6. 1 5 1
  7. """
  8. B = pd.DataFrame(rng.randint(0, 10, (3, 3)), columns=list('BAC'))
  9. """
  10. B:
  11. B A C
  12. 0 4 0 9
  13. 1 5 8 0
  14. 2 9 2 6
  15. """
  16. print(A + B)
  17. Out:: A B C
  18. 0 1.0 15.0 NaN
  19. 1 13.0 6.0 NaN
  20. 2 NaN NaN NaN

从上面的例子可以发现,两个对象的行列索引可以是不同顺序的,结果的索引会自动按顺序排列。在Series中,我们可以通过运算符方法的 fill_value参数自定义缺失值;这里我们将用A中所有值的均值来填充缺失值。

  1. fill = A.stack().mean() # stack()能将二维数组压缩成多个一维数组
  2. print(A.add(B,fill_value=fill))
  3. Out:
  4. A B C
  5. 0 1.0 15.0 13.5 #NaN值都变成了均值
  6. 1 13.0 6.0 4.5
  7. 2 6.5 13.5 10.5

下表中列举了与Python运算符相对应的Pandas对象方法。

Python运算符Pandas方法
+add()
-sub()、subst\fract()
*mul()、multiply()
/truediv()、div()、divide()
//floordiv()
%mod()
**pow()
通用函数:DataFrame与Series的运算

DataFrameSeries的运算规则与Numpy中二维数组与一维数组的运算规则是一样的。来看一个常见运算,让一个二维数组减去自身的一行数据。

  1. A = rng.randint(10, size=(3, 4))
  2. A - A[0]
  3. Out:
  4. array([[ 0, 0, 0, 0],
  5. [-1, -2, 2, 4],
  6. [ 3, -7, 1, 4]]) # 根据Numpy的广播规则,默认是按行运算的

Pandas里默认也是按行运算的,如果想按列计算,那么就需要利用前面介绍过的运算符方法,通过设置axis(轴)实现。

  1. df = pd.DataFrame(A, columns=list('QRST'))
  2. print(df - df.iloc[0])
  3. Out:
  4. Q R S T
  5. 0 0 0 0 0
  6. 1 -1 -2 2 4
  7. 2 3 -7 1 4
  8. print(df.subt\fract(df['R'],axis=0))
  9. Out:
  10. Q R S T
  11. 0 -5 0 -6 -4
  12. 1 -4 0 -2 2
  13. 2 5 0 2 7

DataFrame/Series的运算与前面介绍的运算一样,结果的索引都会自动对齐。

编程要求

本关的编程任务是补全右侧上部代码编辑区内的相应代码,要求实现如下功能:

  • 获取鸢尾花数据集的前30行;
  • 将数据转换为DataFrame,列名为['a','b','c','d']
  • 最后将每一行都减去第一行的值,输出运算后的结果;
  • 具体要求请参见后续测试样例。

请先仔细阅读右侧上部代码编辑区内给出的代码框架,再开始你的编程工作!

测试说明

平台会对你编写的代码进行测试,对比你输出的数值与实际正确的数值,只有所有数据全部计算正确才能进入下一关。

测试输入: 无测试输入

预期输出:

 代码:

import pandas as pd
from sklearn import datasets

def demo1():
    iris = datasets.load_iris().data    # 鸢尾花数据集,返回的是array
    #********** Begin **********#
    iris = iris[:30]
    df = pd.DataFrame(iris,columns=['a','b','c','d'])
    print(df-df.iloc[0])


    #********** End *********

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jerry&

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值