【问题标题】:Python stack loses dataPython堆栈丢失数据
【发布时间】:2021-05-29 05:22:01
【问题描述】:

我正在尝试重新组织我的数据(首要目标是将 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 个值。有谁知道如何解决这个问题?

【问题讨论】:

  • 某处有na吗? stack() 默认丢弃 NA。

标签: python pandas ascii


【解决方案1】:

替换:

df_stack = df[months].stack()

通过

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 2019-07-28
    • 2023-04-03
    • 2014-08-23
    • 2012-10-26
    • 2012-05-02
    • 2013-03-19
    相关资源
    最近更新 更多