【发布时间】: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