【问题标题】:Loop over columns in DF and calculate sum based on condition for every appended column in R or Python循环 DF 中的列并根据 R 或 Python 中每个附加列的条件计算总和
【发布时间】:2017-07-04 09:04:54
【问题描述】:
A B C
1 0 0
0 0 1
0 1 0
1 1 1

这里我有 4*3 数据框(A、B、C 列)。我想根据两行均为 1 的条件计算列组合中的总和。换句话说,在输出中我希望有 1*3 数据帧和 A 2 B 1 C 1。所以,首先我看在 A 列,它有 2 行,所以总和为 2,然后我查看 A 和 B 的组合,只有一行 BOTH 1,所以我得到 1。最后,我得到 A,B 的组合,C 并且它有一排都是一排,所以我也得到 1。能否请您提供在 R 或 Python 中执行此操作的最佳方法。

【问题讨论】:

  • 那么您在寻求什么帮助,rpython?到目前为止你有没有尝试过?
  • 对我来说,这两种语言中的任何一种都可以使用。我现在正试图在 R 中找到快速解决方案,所以我首先循环遍历 df 中的所有列,制作附加列 A、AB、ABC 的列表,然后检查该行应该包含所有要计算的列的条件,计算总和如果满足条件并返回最终 df 作为输出
  • @Dima 您可以通过单击左侧投票按钮旁边的绿色复选标记来接受下面的任何一个答案。

标签: python r loops combinations apply


【解决方案1】:

如果你想要一个系列的结果,你可以这样做。 dictOrderedDict 也很简单

results = pd.Series(index=df.columns)
for i, idx in enumerate(df.columns, 1):
    results[idx] = df.iloc[:,:i].all(axis=1).sum()

结果

A    2.0
B    1.0
C    1.0

【讨论】:

    【解决方案2】:

    作为使用cumsum 的单行字典理解

    d = {col_name: sum(col == i) for i, (col_name, col) in enumerate(df.cumsum(axis=1).iteritems(), 1)}
    

    产量:

    {'A': 2, 'B': 1, 'C': 1}
    

    如果你想要一个系列:

    pd.Series(d, index=df.columns)
    

    这仅适用于您要查找的值是 1(或 True

    【讨论】:

    • 我知道,但据我所知,这是使用不同技术的不同答案。这个对所有值求和,并检查总和是否对应于列号(+1),所以如果原始 DataFrame 中的值不是 1(或True),这个将不起作用。另一个计算每列中的True-ty 值,因此您也可以用其他检查替换它,而不仅仅是bool()
    【解决方案3】:

    假设您的数据框中只有 1 和 0。您可以在 R 中使用 sapply 执行此操作。

    sapply(seq_along(df), function(x)  sum(rowSums(df[1:x]) == x))
    
    #[1] 2 1 1
    

    在这里,我们逐步从数据框中选择一列,并计算其中全部为 1 的行数。

    【讨论】:

      【解决方案4】:

      这是另一种方法,它使用Reduce() 函数将每行中的值从左到右连续相乘。下面的代码要求data.frame中只有1和0。

      library(data.table)
      setDT(DF)[, Reduce(`*`, .SD, accumulate = TRUE)][, lapply(.SD, sum)]
      
         V1 V2 V3
      1:  2  1  1
      

      结果是一个data.table。如果需要矢量,请尝试

      setDT(DF)[, Reduce(`*`, .SD, accumulate = TRUE)][, unname(sapply(.SD, sum))]
      
      [1] 2 1 1
      

      数据

      DF <- structure(list(A = c(1L, 0L, 0L, 1L), B = c(0L, 0L, 1L, 1L), 
          C = c(0L, 1L, 0L, 1L)), .Names = c("A", "B", "C"), row.names = c(NA, 
      -4L), class = "data.frame")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-16
        • 1970-01-01
        • 1970-01-01
        • 2023-01-07
        • 1970-01-01
        • 1970-01-01
        • 2021-10-14
        • 1970-01-01
        相关资源
        最近更新 更多