【问题标题】:Add columns to Python pandas dataframe containing complex logic across rows将列添加到包含跨行复杂逻辑的 Python pandas 数据框
【发布时间】:2020-03-27 18:24:12
【问题描述】:

我有一个如下所示的 pandas 数据框,其中包含“type”和“val0”列。

type    val0
   0       0
   0       0
   0       0
   1       1
   1       3
   0       0
   0       0
   0       0
   0       0
   1       3
   0       0

“类型”列可以是 0 或 1,而 val0 只有 type == 1 才有有趣的值。

我正在尝试创建两列 val1 和 val2。它们的定义方式类似:

  • 对于 val1,我想找到至少一行类型 1 的连续出现,取 val0 的总和作为出现次数,并使用总和填充上一次出现类型 1 到最后一次之间的列连续出现的行。
  • 对于 val2,我想找到至少一行类型 1 的连续出现,取 val0 中的最小值作为出现次数,并使用 min 填充从连续出现的第一行到第类型 1 的下一次出现。

使用 0 作为 val1 和 val2 的默认值,我会得到上述数据帧的输出:

type    val0    val1    val2
   0       0       4       0
   0       0       4       0
   0       0       4       0
   1       1       4       1
   1       3       4       1
   0       0       3       1
   0       0       3       1
   0       0       3       1
   0       0       3       1
   1       3       3       3
   0       0       0       3

由于第 4、5 和 10 行的 type == 1,

  • 对于第 1-5 行,val1 为 1+3 = 4,对于第 6-10 行,val1 为 3
  • 对于第 4-9 行,val2 为 min(1,3) = 1,对于第 10-11 行,则为 3

什么是执行此操作的有效方法?我的实际数据框有几百万行,我想创建许多列,如 val1 和 val2,它们使用类型 1 行的不同聚合。

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用 shift-cumsum 模式 (python pandas - creating a column which keeps a running count of consecutive values)

    grouper = df.groupby(df['type'].ne(df['type'].shift()).cumsum())
    df['val1'] = grouper['val0'].transform(np.sum)
    df['val2'] = grouper['val0'].transform(np.min)
    df.loc[df['type'].eq(0), ['val1', 'val2']] = np.nan
    df['val1'] = df['val1'].bfill().fillna(0)
    df['val2'] = df['val2'].ffill().fillna(0)
    >>> df
        type  val0  val1  val2
    0      0     0   4.0   0.0
    1      0     0   4.0   0.0
    2      0     0   4.0   0.0
    3      1     1   4.0   1.0
    4      1     3   4.0   1.0
    5      0     0   3.0   1.0
    6      0     0   3.0   1.0
    7      0     0   3.0   1.0
    8      0     0   3.0   1.0
    9      1     3   3.0   3.0
    10     0     0   0.0   3.0
    

    【讨论】:

      猜你喜欢
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 1970-01-01
      • 2015-05-14
      • 2018-09-29
      • 2014-10-02
      相关资源
      最近更新 更多