跨列的条件聚合
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
我在 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