Python气象数据处理进阶之Xarray(5):数据整合(分组,合并...)

一、GroupBy: split-apply-combine

这部分同pandas的gorupby函数基本相同,实现对数据的分组归类等等。
split·将数据分为多个独立的组。
apply·对各个组进行操作。
combine·将各个组合并为一个数据对象。

1.split

创建一个dataset

ds = xr.Dataset({"u": (("lat", "lon"), np.random.rand(4, 3))},coords={"latitude": [10, 20, 30, 40], "country": ("x", list("abba"))})
print(ds)
#<xarray.Dataset>
#Dimensions:   (lat: 4, latitude: 4, lon: 3, x: 4)
#Coordinates:
#  * latitude  (lat) int64 10 20 30 40
#    country   (lat) <U1 'a' 'b' 'b' 'a'
#Dimensions without coordinates: lat, lon, x
#Data variables:
#    u         (lat, lon) float64 0.7656 0.3545 0.7117 ... 0.3729 0.4142 0.7367

我对官网的例子加以修改以便更好的理解。
解释下数据结构,创建了一个二维数据u(lat, lon),坐标数据为latitude 和country ,强调一下这里创建的是dataset,而不是dataArray,分不清的可以再看看本系列的第一篇文章。坐标数据不等于u的坐标。创建coords部分都指明了latitude 和 country 都是针对lat的扩展。
我们可以这样理解,对于纬度的分类,我们可以按纬度的大小分,也就是"latitude": [10, 20, 30, 40] ; 我们也可以对纬度所在的国家分,"country": ("x", list("abba") ,那比如我们想求某个国家的数据的平均时就十分方便。
下边我们进行分组:

print(ds.groupby('country').groups)
#{'a': [0, 3], 'b': [1, 2]}

说明第0和第4个数是国家a的,第2和第3是国家b的。
.groups换成.mean() 则就是对分组求平均,以此类推。

print(list(ds.groupby('country')))
#[('a', <xarray.Dataset>
#Dimensions:  (lat: 2, lon: 3)
#Coordinates:
#  * lat      (lat) int64 10 40
#    country  (lat) <U1 'a' 'a'
#Dimensions without coordinates: lon
#Data variables:
#    u        (lat, lon) float64 0.4561 0.1734 0.8716 0.529 0.867 0.8497), ('b', <xarray.Dataset>
#Dimensions:  (lat: 2, lon: 3)
#Coordinates:
#  * lat      (lat) int64 20 30
#    country  (lat) <U1 'b' 'b'
#Dimensions without coordinates: lon
#Data variables:
#    u        (lat, lon) float64 0.4886 0.5533 0.9398 0.1959 0.1999 0.3381)]

必须添加一个list才可以将其分类结果打印出来。直接打印DatasetGroupBy object是不能输出结果的。

那么针对经纬度的坐标的分组怎么实现呢,比如说选出区间在多少到多少之间的?
.groupby_bins() 函数可以解决这一问题。
还是这个数据,"latitude": [10, 20, 30, 40]
那我们想以25为界,分为两组,0-25,25-50

x_bins = [0,25,50]
print(ds.groupby_bins('lat', x_bins).groups)
#{Interval(0, 25, closed='right'): [0, 1], 
#Interval(25, 50, closed='right'): [2, 3]}

2. Apply

在进行了分组后,要对各个分组进行计算。
我们先从dataset 中取出 u 这个dataarray

u = ds["u"]
print(u)
#<xarray.DataArray 'u' (lat: 4, lon: 3)>
#array([[0.45610017, 0.17344946, 0.87160651],
#       [0.48857117, 0.5533467 , 0.93982257],
#       [0.19588396, 0.19992985, 0.33810041],
#       [0.52899729, 0.86697401, 0.84972525]])
#Coordinates:
#  * lat      (lat) int64 10 20 30 40
#    country  (lat) <U1 'a' 'b' 'b' 'a'
#Dimensions without coordinates: lon

比如是实现前边提到的按国家进行数据平均,或者标准化

u.groupby('country').mean(dim='lat')

也可以通过map()函数使用一些自定义的函数,比如说标准化,

def standardize(x):
     return (x - x.mean()) / x.std()
print(u.groupby('country').map(standardize))

这个用法是官方提供的,但是我的Xarray版本过低,还不支持这种用法(Xarray会定期更新,以至于可能我介绍过的一些方法有了更简便的操作,大家可以在评论区留言)。

强调一句,Xarray官方的更新是比较快的,很可能我写在这里的函数官方又给出了更新的版本,但是我没办法做到时刻与官方最新同步,所以如果遇到问题,最好的解决办法还是去查阅官方文档的对应部分。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,552评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,666评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,519评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,180评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,205评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,344评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,781评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,449评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,635评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,467评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,515评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,217评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,775评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,851评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,084评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,637评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,204评论 2 341

推荐阅读更多精彩内容