Pandas分组聚合及编码操作
记录了一些使用Pandas 进行分组聚合相关操作的总结,包括groupby分组, transform, 以及explode等操作。持续发现Pandas的中高效操作
explode 爆炸函数
- 初始化的DataFrame
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 保持不变
df=df.explode("A")
df
A B
0 a,b,c 1
1 b 2
2 a 3
2 e 3
- 同样可以把类列表的文字炸开
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対每组取使用第一个出现的值
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化编码(常规做法)
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的数量万级以上时,可明显看到速度差距)
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
Authors
Senior Researcher
My research interests include large language model, Reinforcement learning for Recommender System and Automatic (AI) Systems.