首發(fā)于微信公眾號東哥夜談。歡迎關注東哥夜談牺弄,讓我們一起聊聊個人成長姻几、投資、編程势告、電影蛇捌、運動等話題。
本帳號所有文章均為原創(chuàng)培慌。文章可以隨意轉載豁陆,但請務必注明作者。如果覺得文章有用吵护,歡迎轉發(fā)朋友圈分享盒音。
1. 緣起
昨天我們討論了如何對 Series 里面的元素進行批量操作,那么同樣的問題對 DataFrame 應該怎么做呢馅而?
2. 操作
DataFrame 有個 apply
方法祥诽,就是把函數(shù)映射到 DataFrame 里面每個 Series 上,對 Series 進行操作瓮恭。這個等于是第一次降維雄坪。
In [3]: df = pd.DataFrame(np.random.randn(4,3), columns=list('bde'), index=['Utah','Ohio','Texas','Oregon'])
In [4]: df
Out[4]:
b d e
Utah 0.241315 -0.586773 -1.365804
Ohio 0.973860 -0.600773 0.437951
Texas 1.003621 -1.142369 -1.374085
Oregon -0.290861 0.728503 -1.356081
In [5]: df.apply(lambda x: x.max()-x.min())
Out[5]:
b 1.737881
d 1.347365
e 3.404816
dtype: float64
這里的 x 就是一個 Series ,對其取最大值與最小值的差屯蹦,得到一個標量维哈;批量操作 df 形成一組標量,這組標量又形成一個 Series登澜。Series 就可以用昨天的方法進一步降維阔挠,實施批量元素操作。
那么如果想直接對 DataFrame 的元素實施批量操作怎么辦呢脑蠕?很容易想到的就是把上面兩個方法結合起來用购撼。pandas 內置了該方法跪削,即applymap
,操作如下
In [12]: df.applymap(lambda x: '%.2f' % x)
Out[12]:
b d e
Utah 1.31 0.53 -0.90
Ohio -0.43 0.24 0.16
Texas 0.35 0.91 -1.74
Oregon 0.14 -0.43 1.66
至此迂求,批量操作問題完美解決碾盐。然而,就在我得意的時候揩局,看到了魚老師對之前問題的回復毫玖,頓時覺得自己探索的好沒勁:
In [13]: round(df, 2)
Out[13]:
b d e
Utah 1.31 0.53 -0.90
Ohio -0.43 0.24 0.16
Texas 0.35 0.91 -1.74
Oregon 0.14 -0.43 1.66
Python 自帶的 round 就可以接受 DataFrame 對象……情何以堪啊情何以堪,又是 apply
又是 map
甚至還用上 lambda
谐腰,呵……
3. 總結
今天我們討論了如何對 DataFrame 進行降維操作孕豹,可以用apply
對 Series進行批量操作,也可用 applymap
對元素進行批量操作十气。
而實際上励背,很多原先只對簡單對象如 int/float 之類操作的純 Python 函數(shù),居然也可以對 pandas 的 Series/DataFrame 進行操作砸西,比如abs
/round
之類叶眉。但對純 Python 的 list 就不可以。
Python 為了語義上的嚴謹芹枷,對各種操作做的限制可以理解衅疙,但還是不得不贊嘆,pandas 的功能實在很好很強大鸳慈!