Pandas的一個(gè)最重要的功能是途凫,可以對(duì)不同索引的對(duì)象進(jìn)行數(shù)據(jù)運(yùn)算危纫。
1、兩個(gè)Series對(duì)象的運(yùn)算
相同索引上的元素直接相加掰派,索引不同的元素默認(rèn)為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、兩個(gè)DataFrame對(duì)象的運(yùn)算
相同索引及相同列上的元素直接相加靡羡,索引或列不同的元素默認(rèn)為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、在算數(shù)運(yùn)算時(shí)填充值
看上面的一大片NaN略步,感覺好像不是很舒適描扯,可以用調(diào)用算數(shù)函數(shù)的方式,為NaN直接填充想要的值趟薄。
靈活的算數(shù)方法
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
我用的例子跟書上的不一樣绽诚,然后發(fā)現(xiàn)fill_value并不是把所有的NaN全都設(shè)置為0,而是將兩個(gè)數(shù)組不重疊的索引或列上的數(shù)值置為0杭煎,然后再完成算數(shù)恩够,但如果某個(gè)索引和列對(duì)應(yīng)的數(shù)據(jù)在兩個(gè)數(shù)組中都沒有,那么其數(shù)值仍然是Na羡铲。
4蜂桶、DataFrame與Series之間的運(yùn)算(廣播)
DataFrame與Series之間的運(yùn)算可以分為兩種情況:
一是匹配列,沿著行廣播犀勒。
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贾费,并且在列上廣播钦购,則必須使用調(diào)用函數(shù)方法。
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。