【问题标题】:Filtering for rows in a Pandas dataframe containing at least one zero过滤包含至少一个零的 Pandas 数据框中的行
【发布时间】:2019-03-17 03:44:19
【问题描述】:

我正在尝试删除 Pandas 数据框中两列中的任何一列都不为零的所有行。我的数据框索引从 0 到 620。这是我的代码:

for index in range(0, 621):
    if((zeroes[index,1] != 0) and (zeroes[index,3] != 0)):
        del(zeroes[index,])

我不断收到一个关键错误。 KeyError: (0, 1)

我的导师建议我更改范围以测试我的数据框中是否有坏行。我做到了。我检查了数据框的尾部,然后将范围更改为 (616, 621)。然后我得到了关键错误:(616, 1)。

有谁知道我的代码有什么问题或为什么我会遇到关键错误?

此代码还会产生 (0,1) 的关键错误:

index = 0
while (index < 621):
    if((zeroes[index,1] != 0) and (zeroes[index,3] != 0)):
        del(zeroes[index,])
index = index + 1

【问题讨论】:

  • 请始终提供一个最小的、完整的、可验证的代码示例。问题显然出在zeroes,但如果不知道zeroes 是什么,我们将无法帮助您。
  • zeroes 是我的数据框的名称。它包含密歇根州各县的平均考试成绩数据。

标签: python pandas for-loop dataframe range


【解决方案1】:

不要在此处使用手动 for 循环。您的错误可能是因为df.__getitem__((x, y))(实际上是df[x, y] 调用的内容)没有意义。

改为使用矢量化操作和布尔索引。例如,要删除第 1 列或第 3 列不等于 0 的行:

df = df[df.iloc[:, [1, 3]].eq(0).any(1)]

之所以有效,是因为eq(0) 创建了一个布尔值数据框,表示等于零,any(1) 过滤具有任何True 值的行。

完整的表格是df.iloc[:, [1, 3]].eq(0).any(axis=1),或df.iloc[:, [1, 3]].eq(0).any(axis='columns') 更清楚。有关详细信息,请参阅pd.DataFrame.any 的文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多