A B
a0 1
a0-2 2
a1 3
a2 4
a2-2 5
a3 6
a4 7
我想在分档下面分组
df.B.sum
[a0~a0-2) 3
[a1~a1-2) 3
[a2~a2-2) 9
[a3~a3-2) 6
[a4~a4-2) 7
如何做到这一点......
答案 0 :(得分:1)
您可以使用缩短版本的列创建新列,然后在此列上进行分组。
# take only the first two characters into the new column
df['group_col'] = df.A.str[:2]
df.groupby('group_col').B.sum()
当然,您可以在创建群组列时发挥自己的作用。
lo = {'a0': 0, 'a1': 1, 'a2': 2, 'a3': 3, 'a4': 3}
df['group_col'] = df.A.str[:2].apply(lambda val: lo[val])
df.groupby('group_col').B.sum()
group_col
0 3
1 3
2 9
3 13
Name: B, dtype: int64
答案 1 :(得分:1)
您可以使用cut
创建的groupby
Series
列A
的第二个字母:
print (df.A.str[1:2].astype(int))
0 0
1 0
2 1
3 2
4 2
5 3
6 4
Name: A, dtype: int32
bins = [-1,0,1,2,5]
labels=['[a0~a0-2)','[a1~a1-2)','[a2~a2-2)','[a3~a4-2)']
s = pd.cut(df.A.str[1:2].astype(int), bins=bins, labels=labels)
print (s)
0 [a0~a0-2)
1 [a0~a0-2)
2 [a1~a1-2)
3 [a2~a2-2)
4 [a2~a2-2)
5 [a3~a4-2)
6 [a3~a4-2)
Name: A, dtype: category
Categories (4, object): [[a0~a0-2) < [a1~a1-2) < [a2~a2-2) < [a3~a4-2)]
df = df.groupby(s).B.sum().reset_index()
print (df)
A B
0 [a0~a0-2) 3
1 [a1~a1-2) 3
2 [a2~a2-2) 9
3 [a3~a4-2) 13
另一个类似的解决方案作为另一个答案,仅使用map
函数:
d = {'a0': '[a0~a0-2)',
'a1': '[a1~a1-2)',
'a2': '[a2~a2-2)',
'a3': '[a3~a4-2)',
'a4': '[a3~a4-2)'}
df = df.groupby(df.A.str[:2].map(d)).B.sum().reset_index()
print (df)
A B
0 [a0~a0-2) 3
1 [a1~a1-2) 3
2 [a2~a2-2) 9
3 [a3~a4-2) 13
答案 2 :(得分:0)
如果您想按照以相同字母和数字开头的元素进行分组,可以像groupby一样使用groupby中的函数:
def group_func(i):
global df
return df.iloc[i]['A'].split("-")[0]
df.groupby(group_func).sum()
否则,如果你想对每两个元素进行分组,
def group_func(i):
return i // 2
df.groupby(group_func).sum()