如何在pandas数据框中剪切和分组

时间:2017-02-01 10:28:03

标签: python pandas dataframe

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

如何做到这一点......

3 个答案:

答案 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 SeriesA的第二个字母:

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