跨列的条件聚合

Conditional aggregation across columns

我在 python 中创建了一个 Pandas DataFrame,它由各种数值列组成,每个列都与一个单独的字母 属性 列配对。我正在尝试根据 属性 聚合数字并将其保存为新的数据框列。

即对于每一行,如果第 N+1 列的值为“C”,则对第 N 列求和。

我查看了各种博客和 groupby,但我认为它们行不通。任何指针将不胜感激。

Date  Amount1 Property1 Amount2 Property2 Amount3 Property3  TOTAL"C" TOTAL"N"
0      40        C        45       N        30       C         ???      ???
1      20        C        40       C        30       C         ???      ???    
2      60        N        80       N        30       C         ???      ???
3      40        C        60       N        30       N         ???      ???

它实际上是使用真值数组和值数组对行 (axis=1) 求和。

df = pd.read_csv(io.StringIO("""Date  Amount1 Property1 Amount2 Property2 Amount3 Property3  TOTAL"C" TOTAL"N"
0      40        C        45       N        30       C         ???      ???
1      20        C        40       C        30       C         ???      ???    
2      60        N        80       N        30       C         ???      ???
3      40        C        60       N        30       N         ???      ???"""), sep="\s+")

# build list of column groups
props=[c for c in df.columns if "Property" in c]
amts=[c for c in df.columns if "Amount" in c]
# use fact False==0 to multiply values to the sum
df["TOTAL\"C\""] = (df[amts].values*(df[props]=="C").values).sum(axis=1)
df["TOTAL\"N\""] = (df[amts].values*(df[props]=="N").values).sum(axis=1)

df

输出

 Date  Amount1 Property1  Amount2 Property2  Amount3 Property3  TOTAL"C"  TOTAL"N"
    0       40         C       45         N       30         C        70        45
    1       20         C       40         C       30         C        90         0
    2       60         N       80         N       30         C        30       140
    3       40         C       60         N       30         N        40        90