【问题标题】:How to properly filter multiple columns in Pandas?如何正确过滤 Pandas 中的多个列?
【发布时间】:2021-12-31 12:27:34
【问题描述】:

我正在使用这个数据集:https://www.kaggle.com/uciml/pima-indians-diabetes-database

我想根据行是否包含任何零来过滤数据框(Outcome 除外)。

当我尝试根据一列过滤数据框时,一切都很好:

但是,当我尝试过滤两列或更多列时,我会得到不同的行数,具体取决于我是否这样做:

或者这个:

我分别得到 429 行和 652 行。

所以我尝试使用iloc进行过滤:

但这只是用 NaN 填充列,但不会删除行。它还改变了Outcome 列,我想保持不变。似乎这种iloc 方法仅在一次过滤一列时有效。

有什么方法可以一次过滤 8 列而不是一次只过滤一个吗?

【问题讨论】:

  • 第一次尝试多列 (data[(data.Pregnancies & data.Glucose) != 0]) 是错误的。第二个是对的。这就是结果不同的原因。
  • 以文本而非图像的形式提供数据。
  • @user17242583 谢谢,这个方法有效

标签: python pandas filtering


【解决方案1】:

您可以使用apply 一次过滤所有列,如果值为0,则检查每个列,如果有则返回true。

result = df.drop(["Outcome"], axis=1).apply(lambda x: x != 0 , axis=0).any(1)
df[result]

不使用 apply 的替代解决方案:

# determine for each value cell whether it it zero
matches = df.drop(["Outcome"], axis=1) == 0

# build rowsums. It counts the number of zero values.
# if there are no zero values in a row, the rowsum is 0
# find all rows with a rowsum of 0
relevant_rows = matches.sum(axis=1) == 0

# subset just those rows with rowsum == 0
df.loc[relevant_rows, :]

【讨论】:

  • 不幸的是,这种方法不起作用,因为某些列仍然包含零值
  • 对不起,我理解'关于行是否包含任何零',因为它们应该包含零。我更新了答案,以便您排除包含至少一个0 的所有行。您可以尝试确认一下吗
  • 我确实尝试了新答案,但它仍然会产生带有零的列,并且数据框的行数与以前相同,因此没有删除任何行。最后我决定手动输入所有这些 (df["Pregnancies"] != 0) & ...... ,但我仍然想知道是否有更好的方法
  • 我添加了另一种应该比apply更有效的方法。
  • 我添加了 cmets
【解决方案2】:

你第一次尝试做多列:

data[(data.Pregnancies & data.Glucose) != 0]

错了。

第二个:

data[(data.Pregnancies != 0) & (data.Glucose != 0)]

是对的。

这就是结果不同的原因。

【讨论】:

  • 谢谢,我用了第二种方法,成功了。
  • 另外,您知道为什么第一种方法不正确以及它实际上在做什么吗?
  • 基本上你对第一个所做的是,你正在创建一个新的 Series 对象,如果两个系列中的任何一个(Pregnancies 和 @ 987654324@) 是按位与...这完全不是你要找的。​​span>
【解决方案3】:

你可以这样做:

df[df.loc[:, 0:5] < 10].dropna(how='all', axis=1).dropna()

它的作用是,它首先创建一个掩码,选择前 5 列中小于 10 的所有值。然后,它从该掩码选择的数据框中选择所有值。

由于掩码不会选择所有列,因此使用该掩码对数据框进行索引将返回该掩码未考虑的列(第 6 列以后)作为纯 NaN 值。 .dropna(how='all', axis=1) 将删除所有为 NaN 的列。

最后,.dropna() 将删除所有包含任何 NaN 的行,留下所有值符合条件(小于 10)的所有行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    相关资源
    最近更新 更多