首页 > 解决方案 > Python堆栈丢失数据

问题描述

我正在尝试重新组织我的数据(总体目标是将 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]

然后我选择实际的时间步长

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

并选择所有具有月度数据的列。然后返回形状

print(df[months].shape)

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

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

而不是预期的形状((8496000,)我得到(8493000,)。奇怪的是脚本在与我用于此示例的数据具有相同形状的其他文件上运行,我没有那个问题。看起来我在 250 年内丢失了一个 Lon/Lat 像素 - 但我不明白为什么?后来当我尝试将数据转换为 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 个值。有谁知道如何解决这一问题?

标签: pythonpandasascii

解决方案


代替:

df_stack = df[months].stack()

经过

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

推荐阅读