有关Pandas 分组聚合相关操作的一些总结,包括groupby分组, transform, 以及explode等操作。
explode 爆炸函数
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
|
- 分组,使用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编码
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
|