2015-11-03 69 views
0

如果在数据框的特定列中共享相同的值,我是否要聚合某些列中的值?如何根据Python中的列值聚合某些行

换句话说,我怎么能从A获取数据帧B?在这个例子中,我想根据列c1中的值进行检查,如果存在具有相同值的行,那么我想将列c3-c5的总和放在行中新列(c6)中的值为“ c“列c2。

答:

c0 c1 c2 c3 c4 c5 
0 1 a d 3 4 0 
1 1 a c 0 0 6 
2 1 b d 3 1 0 
1 1 b c 0 0 1 

B:

c0 c1 c2 c3 c4 c5 c6 
0 1 a d 3 4 0 
1 1 a c 0 0 6 13 
2 1 b d 3 1 0 
1 1 b c 0 0 1 5 

这里是我做了什么:

import pandas as pd 
import numpy as np 
A = pd.read_excel(file_location) 
A['c6'] = pd.Series(0, index=A.index) 
A.c6[A['c2'] == 'c'] = A.c5 + A.c4[A.c1 == A.c1.shift(-1)] + A.c3[A.c1 == A.c1.shift(-1)] 
B = A 
+0

你需要你的数据看起来像B'如果你想要的是某些列的某些列的值,那么具有分组列值和总计列的数据框就足够了吗? – James

+0

@詹姆斯是我想让它看起来像B. – Ana

回答

0
import pandas as pd 
import io 
import numpy as np 
import datetime 

data = """ 
    c0 c1 c2 c3 c4 c5 
0 1 a d 3 4 0 
1 1 a c 0 0 6 
2 1 b d 3 1 0 
1 1 b c 0 0 1 
    """ 

df = pd.read_csv(io.StringIO(data), delimiter='\s+') 

df2 = pd.DataFrame(df.groupby('c1').sum().ix[:,1:].sum(axis=1), columns=['c6']).reset_index() 

df3 = pd.merge(df,df2,on='c1').set_index(df.index) 

print(df3) 

这将使:

c0 c1 c2 c3 c4 c5 c6 
0 1 a d 3 4 0 13 
1 1 a c 0 0 6 13 
2 1 b d 3 1 0 5 
1 1 b c 0 0 1 5 
+0

感谢问题解决! :)我添加了这一行,以便我在c6中获得值为0的列,其列c'中的值为'd':df3.c6 [df3 ['c2'] =='d'] = 0' – Ana

+0

很高兴它出来了。我不确定预期输出中空白数据背后的推理是什么,但现在我看到了。 – Leb