【问题标题】:pandas assign value to more than one columns based on a condition using more than 20 columns熊猫根据使用超过 20 列的条件为多个列分配值
【发布时间】:2021-03-22 08:52:38
【问题描述】:

下面是我正在尝试转换为 python 的 SAS 代码。我可以考虑使用列表comprehension 来执行此操作。或通过使用np.where 使用大的嵌套条件。但我认为有一种更有效的方式来实现输出。

pandas 数据框包含 day1, day2 ... day30dw1, 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 已修改以添加更多解释。希望它有所帮助:)

标签: python pandas


【解决方案1】:

这是我最终能想到的。

day_cols = [f'day{i}' for i in range(2,31)]

df['days_min_value'] = df[day_cols].min(axis=1)
df['dw_colname'] = df[day_cols].idxmin(axis=1).str.extract('(\d+)').astype(int)-1
df['dw_colname'] = 'dw'+df['dw_colname'].astype(str)

df['dflag'] = np.where(df['days_min_value'] == 0, 'Y', 'N')
df['dwflag'] = np.where( (df['dflag'] == 'Y') & (df[df['dw_colname']] != 0), 'Y', 'N')
df.drop(['days_min_value', 'dw_colname'], inplace=True)

【讨论】:

    猜你喜欢
    • 2023-01-11
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 2020-12-11
    • 2020-04-09
    • 1970-01-01
    • 2019-04-28
    相关资源
    最近更新 更多