在 pandas 数据框中,我有一列如下所示:
0 M
1 E
2 L
3 M.1
4 M.2
5 M.3
6 E.1
7 E.2
8 E.3
9 E.4
10 L.1
11 L.2
12 M.1.a
13 M.1.b
14 M.1.c
15 M.2.a
16 M.3.a
17 E.1.a
18 E.1.b
19 E.1.c
20 E.2.a
21 E.3.a
22 E.3.b
23 E.4.a
我需要将第一个元素所在的所有值分组E, M, or L
然后,对于每个组,我需要创建一个子组,其中索引为1, 2, or 3
其中将包含每个的记录lowercase letter
(a、b、c、...)
该解决方案可能适用于任意数量的级别连接元素(在本例中,级别数为 3(例如:A.1.a))
0 1 2
E 1 a
b
c
2 a
3 a
b
4 a
L 1
2
M 1 a
b
c
2 a
3 a
我尝试过:
df.groupby([0,1,2]).count()
但结果缺少L level因为它在最后一个子级别没有记录
解决方法是添加一个虚拟变量,然后将其删除......例如:
df[2][(df[0]=='L') & (df[2].isnull()) & (df[1].notnull())]='x'
df = df.replace(np.nan,' ', regex=True)
df.sort_values(0, ascending=False, inplace=True)
newdf = df.groupby([0,1,2]).count()
这使:
0 1 2
E 1 a
b
c
2 a
3 a
b
4 a
L 1 x
2 x
M 1 a
b
c
2 a
3 a
然后我处理dummy
entry x
稍后在我的代码中...
如何避免这种令人讨厌的使用方式groupby
?