Python 堆栈丢失数据

Python stack loses data

我正在尝试重新组织我的数据(总体目标是将 ASCII 文件转换为 netCDF)。到达那里的步骤之一是获取数据并堆叠列。我的原始数据如下所示:

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

fname = 'data.out'
df = pd.read_csv(fname, header=0, delim_whitespace=True)

print(df)

给予

           Lon    Lat  Year    Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct    Nov    Dec
0       150.25 -34.25  1851  0.027 -0.005 -0.010 -0.034 -0.029 -0.025  0.016 -0.049 -0.055  0.003 -0.029  0.060
1       150.25 -34.25  1852  0.021 -0.002 -0.050  0.071  0.066  0.001  0.021 -0.014 -0.072 -0.050  0.113  0.114
2       150.25 -34.25  1853  0.093  0.094  0.139 -0.019  0.015  0.003  0.018 -0.032 -0.024 -0.010  0.132  0.107
3       150.25 -34.25  1854  0.084  0.071  0.024 -0.004 -0.022  0.005  0.025  0.006 -0.040 -0.051 -0.067 -0.005
4       150.25 -34.25  1855 -0.030 -0.004 -0.035 -0.036 -0.035 -0.012  0.009 -0.017 -0.062 -0.068 -0.077 -0.084
...        ...    ...   ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...    ...
707995  138.75 -19.25  2096 -0.044 -0.039 -0.068 -0.027 -0.023 -0.029 -0.031 -0.002 -0.005  0.018 -0.039 -0.094
707996  138.75 -19.25  2097 -0.041 -0.066 -0.006 -0.018 -0.005 -0.017  0.011  0.018  0.026  0.024  0.010 -0.086
707997  138.75 -19.25  2098 -0.033 -0.044 -0.032 -0.044 -0.046 -0.040 -0.021 -0.017  0.022 -0.011 -0.015 -0.032
707998  138.75 -19.25  2099  0.039  0.016 -0.009  0.001 -0.002  0.001  0.010  0.021  0.026  0.027  0.012 -0.017
707999  138.75 -19.25  2100  0.010 -0.022 -0.024 -0.037 -0.008 -0.020  0.002  0.011  0.011  0.033  0.020 -0.002

[708000 rows x 15 columns]

然后我select实际时间步长

months=list(df.columns)
months=months[3:]

和 select 所有具有月度数据的列。这就是returns的形状

print(df[months].shape)

(708000, 12)。到目前为止一切顺利,但是当我堆叠数据时

df_stack = df[months].stack()
print(df_stack.shape)

而不是预期的形状 ((8496000,) 我得到了 (8493000,)。奇怪的是脚本在其他文件上运行,这些文件与我在这个例子中使用的数据具有相同的形状,但我没有那里有那个问题。看起来我丢失了一个 Lon/Lat 像素 250 年 - 但我不明白为什么?稍后当我尝试将数据转换为 netcdf 文件时,这会成为一个问题。

lons = np.unique(df.Lon)
lats = np.unique(df.Lat)
years = np.unique(df.Year)

nyears = len(years)
nrows = len(lats)
ncols = len(lons)
nmonths = 12

lons.sort()
lats.sort()
years.sort()

time = pd.date_range(start=f'01/{years[0]}',
                     end=f'01/{years[-1]+1}', freq='M')

dx = 0.5
Lon = xr.DataArray(np.arange(-180.+dx/2., 180., dx), dims=("Lon"),
                   attrs={"long_name":"longitude", "unit":"degrees_east"})
nlon = Lon.size
dy = 0.5
Lat = xr.DataArray(np.arange(-90.+dy/2., 90., dy), dims=("Lat"),
                   attrs={"long_name":"latitude", "unit":"degrees_north"})
nlat = Lat.size

out = xr.DataArray(np.zeros((nyears*nmonths,nlat, nlon)),
                   dims=("Time","Lat","Lon"),
                   coords=({"Lat":Lat, "Lon":Lon, "Time":time}))

for nr in range(0,len(df.index),nyears):
    rows = df[nr:nr+nyears]
    thislon = rows["Lon"].min()
    thislat = rows["Lat"].min()
    out.loc[dict(
            Lon=thislon,
            Lat=thislat)] = df_stack[nr*nmonths:(nr+nyears)*nmonths]
ValueError: could not broadcast input array from shape (0,) into shape (3000,)

它缺少我在堆叠数据时丢失的 3000 个值。有谁知道如何解决这个问题?

替换:

df_stack = df[months].stack()

来自

df_stack = df[months].stack(dropna=False)