我在 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)
提前致谢。
这是一个岛屿问题。我们需要首先通过取index并减去cumcount该x组的 来将 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)