【发布时间】:2021-07-26 15:00:53
【问题描述】:
我正在尝试从 NumPy 掩码数组创建 Pandas DataFrame,据我所知,这是受支持的操作。这是源数组的示例:
a = ma.array([(1, 2.2), (42, 5.5)],
dtype=[('a',int),('b',float)],
mask=[(True,False),(False,True)])
输出为:
masked_array(data=[(--, 2.2), (42, --)],
mask=[( True, False), (False, True)],
fill_value=(999999, 1.e+20),
dtype=[('a', '<i8'), ('b', '<f8')])
尝试用pd.DataFrame(a) 创建一个DataFrame 返回:
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-40-a4c5236a3cd4> in <module>
----> 1 pd.DataFrame(a)
/usr/local/anaconda/lib/python3.8/site-packages/pandas/core/frame.py in __init__(self, data, index, columns, dtype, copy)
636 # a masked array
637 else:
--> 638 data = sanitize_masked_array(data)
639 mgr = ndarray_to_mgr(
640 data,
/usr/local/anaconda/lib/python3.8/site-packages/pandas/core/construction.py in sanitize_masked_array(data)
452 """
453 mask = ma.getmaskarray(data)
--> 454 if mask.any():
455 data, fill_value = maybe_upcast(data, copy=True)
456 data.soften_mask() # set hardmask False if it was True
/usr/local/anaconda/lib/python3.8/site-packages/numpy/core/_methods.py in _any(a, axis, dtype, out, keepdims, where)
54 # Parsing keyword arguments is currently fairly slow, so avoid it for now
55 if where is True:
---> 56 return umr_any(a, axis, dtype, out, keepdims)
57 return umr_any(a, axis, dtype, out, keepdims, where=where)
58
TypeError: cannot perform reduce with flexible type
确实支持这个操作吗?目前使用 Pandas 1.3.3 和 NumPy 1.20.3。
更新
支持吗? 根据Pandas documentation here:
或者,您可以将 numpy.MaskedArray 作为数据参数传递给 DataFrame 构造函数,其被屏蔽的条目将被视为缺失。
上面的代码是我问的问题“我会得到什么?”如果我将 NumPy 掩码数组传递给 Pandas,但这是我希望的结果。以上是我能想到的最简单的例子。
我确实希望 Pandas 中的每个系列/列都是单一类型。
更新 2
任何对此感兴趣的人都应该看到这个熊猫GitHub issue;值得注意的是,Pandas 已“弃用对 MaskedRecords 的支持”。
【问题讨论】:
-
通常,在对子类“一无所知”的代码中使用掩码数组将导致仅使用数组的
data部分,而忽略掩码。使用掩码数组的np.ma函数或方法。 “据我所知是受支持的操作”的来源是什么? -
这样的问题应该包括预期的结果。这样可以减少歧义并减少后续问题或修改的需要。
标签: pandas numpy missing-data