【问题标题】:Python3 Pandas Filter by Columns with Unknown Column NamesPython3 Pandas 按列名未知的列过滤
【发布时间】:2019-12-28 02:32:56
【问题描述】:

使用数据集比较不同日期的花名册。它经历了一个支点,我们不知道何时拉出名册的日期,但结果数据集的结构如下:

colA    ColB    colC    colD    Date:yymmdd    Date:yymmdd    Date:yymmdd
Bob     aa      aa      aa      0              0              1        
Jack    bb      bb      bb      1              1              1        
Steve   cc      cc      cc      0              1              1        
Mary    dd      dd      dd      1              1              1        
Abu     ee      ee      ee      1              1              0        

我成功地为前 4 列之后的每一列进行了填充(它们是已知的)。

df.iloc[:,4:] = df.iloc[:,4:].fillna(0)  #<-- Fills blanks on every column after column 4.

问题:现在我正在尝试过滤具有零的列上的 df。有没有办法在 4 之后按列过滤?我试过了:

df = df[(df.iloc[:,4:] == 0)]   # error
df = df[(df.columns[:,4:] == 0)]   # error
df = df[(df.columns.str.contains(':') == 0)]   # unknown columns do have a ':', but didn't work.

有没有更好的方法来做到这一点?查找仅显示 #4 之后的任何列中为 0 的行的结果。

【问题讨论】:

  • "现在我正在尝试过滤具有零的列上的 df。"你能更精确一点吗?你想要的输出是什么?
  • 您好 jpp,要返回的行:Bob、Steve、Abu。它们在第 4 列之后为零。
  • 也许df = df[df.iloc[:, 4:].eq(0).any(1)] ?
  • 有效!您可以将其作为答案,以便我投票吗? “.eq(0).any(1)”是什么意思?
  • 我希望你支持this identical answer,我会将此问题标记为重复问题。答案有效,因为eq(0) 创建了一个布尔值数据框,表示等于零,any(1) 表示每行的 any 值为True。完整的表格是 df.iloc[:, 4:].eq(0).any(axis=1)df.iloc[:, 4:].eq(0).any(axis='columns') 以便更清楚。

标签: python python-3.x pandas filter


【解决方案1】:

下面的 sn-p 将为您提供一个 Dataframe,其中包含 True 和 False 作为 df 的单元格值。

df.iloc[:, 4:].eq(x)

如果您只想拥有 x 所在的那些行,那么您可以使用any() 子句。 就像@jpp 在他的回答中所展示的那样。

在你的情况下,它将是df[df.iloc[:, 4:].eq(0).any(1)]

这将为您提供 Dataframe 的所有行,其中行至少有一个“0”作为数据值

【讨论】:

    【解决方案2】:

    如果所有值都为 0 或更大,则使用 min :

    df[df.columns[:,4:].min(axis = 1) == 0]
    

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 2018-12-27
      • 1970-01-01
      • 1970-01-01
      • 2019-02-24
      • 2017-11-09
      • 1970-01-01
      • 2022-06-20
      • 1970-01-01
      相关资源
      最近更新 更多