gpt4 book ai didi

python - 缺少数据的 pandas groupby 操作

转载 作者:太空狗 更新时间:2023-10-30 01:32:23 26 4
gpt4 key购买 nike

在 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 或 L 的所有值进行分组,然后,对于每个组,我需要创建一个索引为 1 的子组, 2 或 3,每个 小写字母 (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层,因为它没有最后一个子层的记录

解决方法是添加一个虚拟变量,然后将其删除……例如:

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 条目 x ...

如何避免这种使用 groupby 的笨拙方式?

最佳答案

假设所考虑的列由 s 表示,我们可以:

  1. 拆分 "." 分隔符和 expand=True 以生成扩展的 DF

    <
  2. fnc :检查分组框架的所有元素是否仅包含None,然后用虚拟条目替换它们 "" 是通过list-comprehension 建立的。稍后在过滤列表上调用系列构造函数。随后使用 dropna 删除此处出现的任何 None

  3. 执行 groupby w.r.t. 01 列名称并将 fnc 应用于 2


split_str = s.str.split(".", expand=True)
fnc = lambda g: pd.Series(["" if all(x is None for x in g) else x for x in g]).dropna()
split_str.groupby([0, 1])[2].apply(fnc)

产生:

0  1   
E 1 1 a
2 b
3 c
2 1 a
3 1 a
2 b
4 1 a
L 1 0
2 0
M 1 1 a
2 b
3 c
2 1 a
3 1 a
Name: 2, dtype: object

要获得扁平化的DF,请将索引重置为与之前用于对DF 进行分组的级别相同的索引:

split_str.groupby([0, 1])[2].apply(fnc).reset_index(level=[0, 1]).reset_index(drop=True)

产生:

    0  1  2
0 E 1 a
1 E 1 b
2 E 1 c
3 E 2 a
4 E 3 a
5 E 3 b
6 E 4 a
7 L 1
8 L 2
9 M 1 a
10 M 1 b
11 M 1 c
12 M 2 a
13 M 3 a

关于python - 缺少数据的 pandas groupby 操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42195515/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com