【问题标题】:how to keep running the loop in python even after a KeyError即使在 KeyError 之后如何继续在 python 中运行循环
【发布时间】:2020-01-22 15:08:24
【问题描述】:

我在使用可用于创建像素图的代码时遇到问题,尤其是在对选定区域中的数据进行分组的循环中。我无法克服 KeyError。我该如何处理?

我正在使用 Python 3.7,并且我已经尝试对循环进行一些控制,但循环没有结束,因为第一个遇到的像素似乎是空的。 我还尝试使用 try: 和 except:KeyError,但最后我得到了一行我无法重塑的行,因为显然,循环只是跳过了空的子数据帧。 这里我汇报一下主要的代码步骤,让大家知道'lin'和'col'是整数,表示某个度量在某个像素中的位置:

第一次试用:

mean_val=[]
row=[]

for i in range (0,Ypix):

   for j in range (0,Xpix):

      data_pix = data.groupby(['lin', 'col']).get_group((i,j))[['ref', 'th']]

      if KeyError:
                data_pix = pd.DataFrame()

       else:
                mean_level= data_pix['ref'].mean()  
                row.append(mean_level)

mean_val = np.array(row).reshape(Ypix, Xpix) 

第二次试用:

mean_val=[]
row = []

for i in range (0,Ypix):

  for j in range (0,Xpix):

      try:
         data_pix=data.groupby(['lin', 'col']).get_group((i,j))[['ref', 'th']]

      except KeyError:
         data_pix = pd.DataFrame()

      else:

         mean_level= data_pix['ref'].mean()  
         row.append(mean_level)

mean_val = np.array(row).reshape(Ypix, Xpix)

我希望最后一行被重新整形以获得地图,并且我希望至少获得一个没有数据的空像素,以便正确地重新整形。显示的错误如下:

第一次试用:

Traceback (most recent call last):
File "grid.py", line 385, in <module>
    proc.process()

File "grid.py", line 106, in process
    data_pix = data.groupby(['lin', 'col']).get_group((i,j))[['ref', 'th']]

File "C:\xxx\yyy\AppData\Local\Programs\Python\Python37\lib\site-packages\pandas\core\groupby\groupby.py", line 680, in get_group

  raise KeyError(name)

KeyError: (0, 0)

第二次试用:

Traceback (most recent call last):
  File "grid.py", line 379, in <module>
    proc.process()

File "grid.py", line 276, in process

   mean_val = np.array(row).reshape(Ypix, Xpix) 

ValueError: cannot reshape array of size 1506 into shape (50,50)

有人可以帮帮我吗?

【问题讨论】:

  • 这里面有些东西倒退了。您不应该在双重嵌套的for 循环中使用groupby。您使用一次groupby,然后您可能会迭代结果。但肯定不会在循环执行该操作。不过,我不确定我是否遵循最终结果

标签: python pandas dataframe for-loop pandas-groupby


【解决方案1】:

我想,您的 groupby 为可能的 fraction 提供了组 ij 的组合(对于 i / j 的某些组合,有 没有对应的组)。

然后单独处理异常(如其他答案中所建议)将不会 工作,因为你:

  • 仅收集现有组的数据,
  • 然后尝试重塑它们,就像您拥有所有组的数据一样。

我的建议是,不要收集所有组合的数据 i / j 的,缺少特定组的异常处理, 您应该填写中间结果的每个元素, 仅适用于现有组。比如:

means = data.groupby(['lin', 'col'])['ref'].mean()

结果是一个系列

  • 一个由lincol组成的MultiIndex——像素坐标,
  • value - 表示当前组中的 ref

然后将此表转码为您的结果表(大小为 Xpix * Ypix), 用一些表示“无数据”的值填充剩余的单元格(例如 0)。

注意:由于您没有提供任何示例数据,我无法做任何事情 测试,所以以上所有内容都是基于我对你的情况的理解 并且很可能需要一些更正/完成才能获得 真正有效的代码。

补充:如何进行转码(示例)

假设意味着——来源系列是:

         ref
lin col     
0   0      1
    1      2
    2      3
1   0      4
    1      5
    2      6
2   0      7
    1      8
    2      9

运行:

Xpix = 5; Ypix = 5       # Target array size (example)
df1 = means.unstack()    # Convert to DataFrame
# Drop top level from the column index ('ref')
df1.columns = df1.columns.droplevel()
df1.columns.name = None  # Drop the name from the column index ('col')
df1.index.name = None    # Drop the name from the row index ('lin')
# Reindex (change the shape), and fill with "empty" values
df1 = df1.reindex(index=range(Xpix), columns=range(Xpix), fill_value=0)

结果是:

   0  1  2  3  4
0  1  2  3  0  0
1  4  5  6  0  0
2  7  8  9  0  0
3  0  0  0  0  0
4  0  0  0  0  0

现在你有了一个带有默认列索引和默认行索引的 DataFrame, 但如果您愿意,您可以使用 df1.values - 底层 Numpy 数组。

【讨论】:

    【解决方案2】:

    如果你真的想忽略 KeyError,你可以写这样的代码:

     except KeyError:
          pass
    

    【讨论】:

      猜你喜欢
      • 2017-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 1970-01-01
      • 2022-09-30
      • 2023-01-13
      • 1970-01-01
      相关资源
      最近更新 更多