Python 跨列的条件聚合

Python 跨列的条件聚合,python,pandas,dataframe,aggregation,Python,Pandas,Dataframe,Aggregation,我用python创建了一个Pandas数据框架,它由各种数字量列组成,每一列都与一个单独的字母属性列配对。我正在尝试根据属性聚合数字,并将其另存为新的dataframe列 i、 e.对于每一行,如果N+1列的值为“C”,则对N列求和 我看了各种博客和groupby,但我认为它们不会奏效。任何指点都将不胜感激 Date Amount1 Property1 Amount2 Property2 Amount3 Property3 TOTAL"C" TOTAL"N&qu

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

i、 e.对于每一行,如果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
输出
欢迎来到堆栈溢出。请阅读如何问好。确保你的问题涵盖以下3个要素:1。问题陈述2。您的代码(应该是3.错误消息(最好是完全回溯,以帮助其他人查看并提供反馈)。非常感谢,效果非常好,而且简单快捷。你是一个真正的传奇人物。很高兴它起到了作用。请接受答案对不起,我该如何接受答案?你会在答案旁边看到一个勾号,点击它。类似于如果你看到另一个问题的答案,你可以投票。很高兴认识提供答案的人帮忙
 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