【问题标题】:Replacing all values in a column with conditions on a dataframe用数据框上的条件替换列中的所有值
【发布时间】:2022-01-10 18:20:51
【问题描述】:

我有一组不错的数据(37509、166)。我目前正在尝试根据一组条件替换几列中的 0 。在更改该值之前,我继续收到内存错误,现在我的内核不断崩溃。我的问题是,有没有更好的方法来编写避免内存问题的代码?

df = pd.read_csv(".csv")
cols = list(df.select_dtypes(include=[np.number]).columns)
mask = (df["column1"] <= 0) & (df["column2"] == 0)
df.loc[mask, df[cols]] = np.nan

用于掩码的两列不包含在 cols 列表中,我一次尝试了 1 列。我每次都遇到 MemoryError 。我已经尝试通过 Terality 运行它,但遇到了同样的问题。

错误是:

MemoryError: 无法为形状为 (37509, 37509) 且数据类型为 float64 的数组分配 10.5 GiB。

以下代码对于列列表或单个列也不起作用(我理解为什么此代码不适用于副本 vs 视图):

df[mask][cols].replace(0, np.nan, inplace=True)

如果有人愿意帮助解释解决方案,甚至只是解释问题,我将不胜感激。

【问题讨论】:

  • df.loc[mask, df[cols]] = np.nan 应该是 df.loc[mask, cols] = np.nan(列索引器应该只是列名列表,而不是这些列的数据框)
  • 能否请您提供一些来自您的 df 的示例行?这样,我们可以从样本中生成更大的数据框。

标签: python pandas dataframe memory


【解决方案1】:

DataFrame.loc 接受布尔值或标签:

通过标签或布尔数组访问一组行和列。

目前列索引器是一个完整的数据框df[cols]

df.loc[mask, df[cols]] = np.nan
#            ^^^^^^^^

仅使用cols 列表而不是df[cols]

df.loc[mask, cols] = np.nan
#            ^^^^

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-15
    • 1970-01-01
    • 2022-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 1970-01-01
    相关资源
    最近更新 更多