有关Pandas 分组聚合相关操作的一些总结,包括groupby分组, transform, 以及explode等操作。

explode 爆炸函数

  • 初始化的DataFrame
1
2
3
4
5
6
7
df = pd.DataFrame({'A': ["a,b,c", "b", ["a", "e"]], 'B': [1, 2, 3]})
df

        A   B
0	a,b,c	1
1	b	2
2	[a, e]	3
  • explode函数, 默认将列表数据炸开,分成多行,并且index 保持不变
1
2
3
4
5
6
7
8
df=df.explode("A")
df

        A	B
0	a,b,c	1
1	b	2
2	a	3
2	e	3
  • 同样可以把类列表的文字炸开
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
df.set_index(["B"]).apply(lambda x: x.str.split(",")).explode("A").reset_index()
# 另一种assign的实现
# df2= df.assign(A=df.A.str.split(',')).explode('A').reset_index(drop=True)


        A	B
0	a	1
1	b	1
2	c	1
3	b	2
4	a	3
5	e	3

groupby分组以及transform

  • 分组,使用transform対每组取使用第一个出现的值
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
df2["B"] = df2.groupby("A")["B"].transform("first")
df2

       A   B
0	a	1
1	b	1
2	c	1
3	b	1
4	a	1
5	e	3

对列数据进行ID编码

  • 对A列中出现的值进行ID化编码(常规做法)
1
2
3
4
5
6
7
8
9
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df2['ID1'] = le.fit_transform(df2['A'])

# 获取map
le_mapping = dict(zip(le.classes_, le.transform(le.classes_)))
le_mapping

{'a': 0, 'b': 1, 'c': 2, 'e': 3}
  • ID编码的高性能版(当map的数量万级以上时,可明显看到速度差距)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
c= df2.A.astype("category")
d = dict(enumerate(c.cat.categories))
map2 = {v: k for k, v in d.items()}
map2

{'a': 0, 'b': 1, 'c': 2, 'e': 3}

df2["ID2"] = c.map(map2)

# output
	A	B	ID1	ID2
0	a	1	0	0
1	b	1	1	1
2	c	1	2	2
3	b	1	1	1
4	a	1	0	0
5	e	3	3	3