2017-06-19 56 views
0

我有一个数据帧,看起来像这样返回结果:总和特定行的基于布尔指标和新列

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可变

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') 

对此的任何帮助?

+0

尝试'df.groupby(['ID','Shop'])['Sales']。agg(['sum'])' – haifzhan

+0

你可以看到我的答案,你也可以解释这个问题: https://stackoverflow.com/questions/44197374/how-can-create-counts-of-terms-in-a-one-column-and -abend-the-counts-as-additiona – Wen

回答

1

根据你的努力

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 
+0

这回答了自动命名列的第二个问题,但总和应该基于'Ind'变量。例如,在A中,我们仅对Ind为'T'的值进行求和。我需要编辑我的问题以使其更清晰! – owise

+0

我想我可以做到这一点,只需在'groupby'中添加'Ind'就可以了: DF ['SUM'] = DF.groupby(['Ind','ID','Shop'] )['Sales']。transform('sum')' – owise

+0

我可以简单地添加这个'DF.ix [DF.Ind == 0,'SUM'] = 0'。 @文:请相应地编辑你的答案,以便我接受它,我也编辑了我的问题,以获得更清晰的知识分享 – owise

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)) 
0

你能做到这样

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 

没有合并或CONCAT和更快的另一种解决方案给出了相同的结果

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