美文网首页Pandas
Python学习笔记(9):Series和DataFrame的算

Python学习笔记(9):Series和DataFrame的算

作者: 刘爱玛 | 来源:发表于2019-02-12 20:42 被阅读1次

    Pandas的一个最重要的功能是,可以对不同索引的对象进行数据运算。

    1、两个Series对象的运算

    相同索引上的元素直接相加,索引不同的元素默认为NA值。

    import pandas as pd
    import numpy as np
    from pandas import Series, DataFrame
    s1 = Series([7.3, -2.5, 3.4, 1.5], index = ['a', 'c', 'd', 'e'])
    s2 = Series([-2.1, 3.6, -1.5, 4, 3.1], index = ['a', 'c', 'e', 'f', 'g'])
    s1 + s2
    输出:
    a    5.2
    c    1.1
    d    NaN
    e    0.0
    f    NaN
    g    NaN
    dtype: float64
    

    2、两个DataFrame对象的运算

    相同索引及相同列上的元素直接相加,索引或列不同的元素默认为NA值。

    df1 = DataFrame(np.arange(9).reshape((3, 3)), columns = list('bcd'), index = ['Ohio', 'Texas', 'Colorado'])
    df2 = DataFrame(np.arange(12).reshape((4, 3)), columns = list('bde'), index =  ['Utah', 'Ohio', 'Texas', 'Oregon'])
    df1 + df2
    输出:
        b   c   d   e
    Colorado    NaN NaN NaN NaN
    Ohio    3.0 NaN 6.0 NaN
    Oregon  NaN NaN NaN NaN
    Texas   9.0 NaN 12.0    NaN
    Utah    NaN NaN NaN NaN
    

    3、在算数运算时填充值

    看上面的一大片NaN,感觉好像不是很舒适,可以用调用算数函数的方式,为NaN直接填充想要的值。


    灵活的算数方法
    df1.add(df2, fill_value = 0)
    输出:
        b   c   d   e
    Colorado    6.0 7.0 8.0 NaN
    Ohio    3.0 1.0 6.0 5.0
    Oregon  9.0 NaN 10.0    11.0
    Texas   9.0 4.0 12.0    8.0
    Utah    0.0 NaN 1.0 2.0
    

    我用的例子跟书上的不一样,然后发现fill_value并不是把所有的NaN全都设置为0,而是将两个数组不重叠的索引或列上的数值置为0,然后再完成算数,但如果某个索引和列对应的数据在两个数组中都没有,那么其数值仍然是Na。

    4、DataFrame与Series之间的运算(广播)

    DataFrame与Series之间的运算可以分为两种情况:
    一是匹配列,沿着行广播。

    frame = DataFrame(np.arange(12).reshape((4, 3)), columns = list('bde'), index = ['Utah', 'Ohio', 'Texas', 'Oregon'])
    series = frame.ix['Utah']
    frame - series
    输出:
        b   d   e
    Utah    0   0   0
    Ohio    3   3   3
    Texas   6   6   6
    Oregon  9   9   9
    

    如果DataFrame的列在Series的索引中找不到,则以Na填充。

    series2 = Series(range(3), index = ['b', 'e', 'f'])
    frame + series2
    输出:
        b   d   e   f
    Utah    0.0 NaN 3.0 NaN
    Ohio    3.0 NaN 6.0 NaN
    Texas   6.0 NaN 9.0 NaN
    Oregon  9.0 NaN 12.0    NaN
    

    如果希望DataFrame的行匹配到Series的index,并且在列上广播,则必须使用调用函数方法。

    series3 = frame['d']
    frame.sub(series3, axis = 0)
    输出:
        b   d   e
    Utah    -1  0   1
    Ohio    -1  0   1
    Texas   -1  0   1
    Oregon  -1  0   1
    

    axis代表要匹配的轴,这里要匹配的是DataFrame的行,所以axis = 0。

    相关文章

      网友评论

        本文标题:Python学习笔记(9):Series和DataFrame的算

        本文链接:https://www.haomeiwen.com/subject/fhxleqtx.html