【发布时间】:2021-03-22 08:52:38
【问题描述】:
下面是我正在尝试转换为 python 的 SAS 代码。我可以考虑使用列表comprehension 来执行此操作。或通过使用np.where 使用大的嵌套条件。但我认为有一种更有效的方式来实现输出。
pandas 数据框包含 day1, day2 ... day30 和 dw1, dw2... dw30 列。条件是查找任何列(比如day2 to day30 中大于0 的day(x) 并将'Y' 分配给标志列。如果dw(x-1) 不为0,则将'Y' 分配给dwflag。
数据
day1 day2 day3 day4 dw1 dw2 dw3 dw4
1 1 0 1 0 0 0 0
1 0 1 1 1 0 0 0
1 1 1 0 0 0 0 0
1 1 1 0 0 0 1 0
1 1 1 1 0 0 0 0
预期输出
day1 day2 day3 day4 dw1 dw2 dw3 dw4 dflag dwflag
1 1 0 1 0 0 0 0 Y N
1 0 1 1 1 0 0 0 Y Y
1 1 1 0 0 0 0 0 Y N
1 1 1 0 0 0 1 0 Y Y
1 1 1 1 0 0 0 0 N N
SAS 代码
dflag= 'N';
DO I = 2 TO 30 WHILE(dflag='N');
IF day(I) = 0 THEN
DO;
dflag='Y';
IF dw(I-1) NE 0 THEN
dwflag = 'Y';
END;
END;
IF dwflag NE 'Y' THEN dwflag='N';
【问题讨论】:
-
明确地说,您希望将相同的逻辑重复应用于数组(或 DataFrame)的一堆行......并且您不希望发生任何类型的循环?或者您只是希望循环由 Numpy(或 Pandas)在内部完成?例如,您是否尝试编写
np.where版本?如果是这样,您对它有什么不满意的地方? -
@KarlKnechtel 是的。那是正确的。 np.where 变得太长,因为它必须超过 29 列。所以我正在寻找一种方法来从 30 个
day列中识别第一个为零的day列。 -
明确一点:您要查找每个单元格值都为零的行吗?
-
@KarlKnechtel No. 我想找到其中具有零值的
first单元格。然后在找到第一次出现时,它会停止检查cells的其余部分并移动到下一个row。 -
@KarlKnechtel 已修改以添加更多解释。希望它有所帮助:)