pandas – 将多索引数据帧转换为Xarray数据集要么丢失年度序列,要么给出错误

首先 – 道歉但我无法使用代码重现此错误.我将尝试使用数据和错误的屏幕截图尽可能地描述它.

我有一个由’Year’和’Season’索引的大型数据框,其中包含纬度,经度和降雨量的值,其他一些看起来像这样:《pandas – 将多索引数据帧转换为Xarray数据集要么丢失年度序列,要么给出错误》

这是为了尊重“冬天”,“春天”,“夏天”,“秋天”(季节专栏中的数字1:4)的年度顺序 – 我需要在转换为Xarray数据集之后保持这个序列.但如果我尝试直接转换为数据集:

future = future.to_xarray()

我收到以下错误:《pandas – 将多索引数据帧转换为Xarray数据集要么丢失年度序列,要么给出错误》

所以很明显我需要通过唯一标识符重新索引,我尝试使用lat和lon,但这会产生相同的错误(因为有重复).重置索引然后重新索引然后使用lat,lon和time
 像这样:

future = future.reset_index()
future.head()

《pandas – 将多索引数据帧转换为Xarray数据集要么丢失年度序列,要么给出错误》

future.set_index(['latitude', 'longitude', 'time'], inplace=True)
future.head()

《pandas – 将多索引数据帧转换为Xarray数据集要么丢失年度序列,要么给出错误》

允许的

future = future.to_xarray()

代码工作:

《pandas – 将多索引数据帧转换为Xarray数据集要么丢失年度序列,要么给出错误》

问题是现在已经失去了它的年度排序,您可以从数据集中的季节变量看到它在一年的前3个月从’1”1”1’开始,但随后跳到’3′ ,’3′,’3’意味着我们要从冬天到夏天,跳过春天.

这只是在重新索引数据帧之后的情况,但我无法在没有重新索引的情况下将其转换为数据集,而且我似乎无法在不中断年度序列的情况下重新编制索引.有办法解决这个问题吗?

我希望这很清楚,并且错误的说明足以让某人能够提供帮助!

编辑:
我认为这里的问题是它按日期索引它会按时间顺序自动排序日期(例如1952年跟随1951年等),但我不想这样,我希望它保持初始数据框中的序列(按季节组织,但它可能有一个1955年的春天,然后是2000年的夏天,然后是1976年的秋天) – 我需要保留这个序列.

编辑2:

因此,当我将’Year’设置为索引时,数据集看起来像这样,或者只是保持索引通用《pandas – 将多索引数据帧转换为Xarray数据集要么丢失年度序列,要么给出错误》但我需要tg变量来使lat / lon与之关联,因此数据集如下所示:

<xarray.Dataset>
Dimensions:    (Year: 190080)
Coordinates:
  * Year       (Year) int64 1970 1970 1970 1970 1970 1970 1970 1970 1970 ...
Data variables:
    Season     (Year) object '1' '1' '2' '2' '2' '3' '3' '3' '4' '4' '4' '1' ...
    latitude   (Year) float64 51.12 51.12 51.12 51.12 51.12 51.12 51.12 ...
    longitude  (Year) float64 -10.88 -10.88 -10.88 -10.88 -10.88 -10.88 ...
    seasdif    (Year) float32 -0.79192877 -0.79192877 -0.55932236 ...
    tg         (Year, latitude, longitude) float32 nan nan nan nan nan nan nan nan nan nan nan ...
    time       (Year) datetime64[ns] 1970-01-31 1970-02-28 1970-03-31 ...

最佳答案 告诉我这是否适合你.我添加了一个额外的索引列,并使用它进行排序.

import pandas as pd
import xarray as xr
import numpy as np

df = pd.DataFrame({'Year':[1951,1951,1951,1951],'Season':[1,1,1,3],'lat': 
[51,51,51,51],'long':[10.8,10.8,10.6,10.6],'time':['1950-12-31','1951-01-31','1951- 
02-28','1950-12-31']})

将索引作为单独的列’Order’,然后将其与set_index一起使用.这是因为我只能对索引或一维列进行排序,而且我们有三个坐标.

df.reset_index(level=0, inplace=True)
df = df.rename(columns={'index': 'Order'})
df['time'] = pd.to_datetime(df['time'])
df.set_index(['lat', 'long', 'time','Order'], inplace=True)
df.head()
df = df.to_xarray()

这应该保留顺序并且具有与tg相关的lat,lon,time(虽然我没有在df中使用它).

df2 = df
df2.sortby('Order')

您也可以删除“订单”列,但我不确定它是否会改变您的订单.(它不会改变我的订单)

df2.drop('Order')

《pandas – 将多索引数据帧转换为Xarray数据集要么丢失年度序列,要么给出错误》

点赞