基于布尔指示符的特定行的总和,并在新列中返回结果



我有一个数据框,如下所示:

DF = 
 ID  Shop  Sales  Ind 
 1   A     554    T
 2   B     678    F
 3   A     546    T
 4   A     896    T
 5   B     426    F
 6   B     391    T
 7   C     998    F
 8   C     565    T
 9   C     128    T

我正在尝试对每个 ID 的每个商店的销售额求和,以便将它们放在单独的列中,如下所示(其中 x 是总和(。求和的值应仅与 Ind 变量中的 True 值匹配的值

DF2 = 
 ID  Shop  Sales  Ind   A_Sum    B_Sum   C_Sum
 1     A     554    T     x       0       0
 2     B     678    F     0       x       0
 3     A     546    T     x       0       0
 4     A     896    T     x       0       0
 5     B     426    F     0       x       0
 6     B     391    T     0       x       0
 7     C     998    F     0       0       x
 8     C     565    T     0       0       x
 9     C     128    T     0       0       x

我试过这个,但我远非正确!我坚持如何在求和运算中对布尔索引进行编码?以及自动命名列

DF2 = DF.groupby(['ID', 'Shop'])['Sales'].transform('sum')   

对此有任何帮助吗?

基于您的努力

DF['SUM']=DF.groupby(['ID', 'Shop'])['Sales'].transform('sum')
DF.loc[DF.Ind == 'F', 'SUM'] = 0
pd.concat([DF,DF.pivot(columns='Shop',values='SUM').
          add_suffix('_Sum').fillna(0)],axis=1).drop(['SUM'],axis=1)
Out[247]: 
   ID Shop  Sales Ind  A_Sum  B_Sum  C_Sum
0   1    A    554   T  554.0    0.0    0.0
1   2    B    678   F    0.0    0.0    0.0
2   3    A    546   T  546.0    0.0    0.0
3   4    A    896   T  896.0    0.0    0.0
4   5    B    426   F    0.0    0.0    0.0
5   6    B    391   T    0.0  391.0    0.0
6   7    C    998   F    0.0    0.0    0.0
7   8    C    565   T    0.0    0.0  565.0
8   9    C    128   T    0.0    0.0  128.0

你也许想要这样的东西吗?

Shop = ["A", "B", "A", "A", "B", "B", "C", "C", "C"]
Sales = [554, 678, 546, 896, 426, 319, 998, 565, 128]
List = ["A", "B", "C"]
A = []
B = []
C = []
Ticker = 0
for x in range(len(Sales)):
    if Shop[Ticker] == "A":
        A.append(Sales[Ticker])
    elif Shop[Ticker] == "B":
        B.append(Sales[Ticker])
    else:
        C.append(Sales[Ticker])
    Ticker += 1
print(sum(A), sum(B), sum(C))

你可以这样做

df.merge(df.groupby(['ID','Shop']).Sales.sum().unstack(fill_value = 0).reset_index(), on = 'ID').rename(columns = {'A': 'A_sum', 'B': 'B_sum', 'C': 'C_sum'})

    ID  Shop    Sales   Ind A_sum   B_sum   C_sum
0   1   A       554     T   554     0       0
1   2   B       678     F   0       678     0
2   3   A       546     T   546     0       0
3   4   A       896     T   896     0       0
4   5   B       426     F   0       426     0
5   6   B       391     T   0       391     0
6   7   C       998     F   0       0       998
7   8   C       565     T   0       0       565
8   9   C       128     T   0       0       128

没有合并或连接且速度更快的另一种解决方案给出了相同的结果

df[['ID','A_sum', 'B_sum', 'C_sum']] = df.groupby(['ID','Shop']).Sales.sum().unstack(fill_value = 0).reset_index()

相关内容

最新更新