创建 pandas 汇总表(但不创建 groupby)

Win*_*ton 3 python pandas

我在 pandas 中得到了下表:

X y
1 1
2 3
2 5
2 4
1 4
1 5

我想看到变量的模式x,所以我想看到模式的走向。

在表中,您会看到 x=1,然后 x=2 三次,然后返回 x=1 两次。

X # 出现次数 第一个 y 值 最后 y 值
1 1 1 1
2 3 3 4
1 2 4 5

我最初尝试过groupby,但使用 groupby 会将所有 x 分组在一起,这不是所需的方式。

为了方便起见,我应该提供数据框的内容。

data = {'x': [1, 2, 2, 2, 1, 1],
        'y': [1, 3, 5, 4, 4, 5]}
df = pd.DataFrame(data)
Run Code Online (Sandbox Code Playgroud)

提前致谢。

Nic*_*ick 6

这是一个岛屿问题。我们需要首先通过取index并减去cumcountx组的 来将 x 值分组为岛:

group = df.index - df.groupby('x').cumcount()
Run Code Online (Sandbox Code Playgroud)

输出:

0    0
1    1
2    1
3    1
4    3
5    3
dtype: int64
Run Code Online (Sandbox Code Playgroud)

我们现在可以按该变量进行分组,为所需的输出添加适当的函数列表:

df.groupby(group).agg({'x':[('x', 'first'), ('# occurrence', 'size')], 'y':[('first y', 'first'), ('last y', 'last')]}).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

输出:

0    0
1    1
2    1
3    1
4    3
5    3
dtype: int64
Run Code Online (Sandbox Code Playgroud)

根据您的 pandas 版本(>=0.25),您还可以使用字典来指定聚合:

df.groupby(group).agg(**{ 'x' :('x', 'first'), '# occurrence':('x', 'count'), 'first y':('y', 'first'), 'last y':('y', 'last')})
Run Code Online (Sandbox Code Playgroud)

输出:

   x  # occurrence  first y  last y
0  1             1        1       1
1  2             3        3       4
3  1             2        4       5
Run Code Online (Sandbox Code Playgroud)