将 nan 值添加到数据框会给出无法散列的类型:'numpy.ndarray' in Python

Adding a nan values to dataframe gives unhashable type: 'numpy.ndarray' in Python

我想插入np.nan到一个dataframe;每行一个 nan,位置随机。
这是我的dataframe

list_cols= ['col01', 'col02', 'col03', 'col04', 'col05','col06', 'col07', 'col08', 'col09', 'col10','col11', 'col12', 'col13', 'col14', 'col15', 'col16']

X_full = pd.DataFrame(np.random.uniform(low=1.0, high=100.0, size=(5,16)), columns=list(list_cols))

这是我的代码:

# Add a single nan value to each row
rng = np.random.RandomState(0)
n_samples, n_features = X_full.shape
X_missing = X_full.copy()
missing_samples = np.arange(n_samples)
missing_features = rng.choice(n_features, n_samples, replace=True)
X_missing[missing_samples, missing_features] = np.nan

它returns TypeError: unhashable type: 'numpy.ndarray'.
感谢帮助。

由于我不能 100% 确定我是否正确理解了您的问题,以防您只是想将单个单元格的值更改为 NaN(即 (0, 12) & (1, 7) 等处的值)应该是 nan) 那么你可以使用:

for row, column in zip(missing_samples, missing_features):
    X_missing.iat[row, column] = np.nan

请注意,我们使用以 'i': .iat 开头的方法。这意味着我们正在应用的更改是基于 I 索引而不是 row/column 名称。

在您的示例中,您会收到一个错误,因为它将 missing_samplesmissing_features 解释为行名和列名,但您提供的值是数字(即索引)。您可以使用 .iloc 来澄清您提供的是索引而不是名称,但随后它将替换整行,这就是我使用 .iat 的原因,因为我假设您只想替换值 ' at' 特定的'i ndices'。希望这有帮助

你可以做到

X_missing = X_full.copy()
indexes = np.random.choice(range(X_missing.shape[1]), X_missing.shape[0])
X_missing.values[range(X_missing.shape[0]), indexes] = np.nan