DnV*_*nVS 6 python dataframe pandas
我的数据框如下所示:
import pandas as pd
example = [{'A':3}, {'A':5}, {'A':0}, {'A':2}, {'A':6}, {'A':9}, {'A':0}, {'A':3}, {'A':4}]
df = pd.DataFrame(example)
print(df)
Run Code Online (Sandbox Code Playgroud)
输出:
df
3
5
0
2
6
9
0
3
4
Run Code Online (Sandbox Code Playgroud)
在df中出现0后,将出现一个新的“集群”。我想给每个群集一个唯一的值,如下所示:
df
3 A
5 A
0 -
2 B
6 B
9 B
0 -
3 C
4 C
Run Code Online (Sandbox Code Playgroud)
我尝试使用枚举和itertools,但是由于我是Python新手,所以我一直在努力使用这些选项的正确用法和语法。
您可以通过使用cumsum和映射到字母chr:
m = df['A'].eq(0)
df['B'] = m.cumsum().add(65).map(chr).mask(m, '-')
df
A B
0 3 A
1 5 A
2 0 B
3 2 B
4 6 B
5 9 B
6 0 C
7 3 C
8 4 C
Run Code Online (Sandbox Code Playgroud)
可以使用编写一个NumPy解决方案views,并且应该相当快:
m = np.cumsum(df['A'].values == 0)
# thanks to @user3483203 for the neat trick!
df['B'] = (m + 65).view('U2')
df
A B
0 3 A
1 5 A
2 0 B
3 2 B
4 6 B
5 9 B
6 0 C
7 3 C
8 4 C
Run Code Online (Sandbox Code Playgroud)
从v0.22开始,您还可以通过pandas来执行此操作Series.view:
m = df['A'].eq(0)
df['B'] = (m.cumsum()+65).view('U2').mask(m, '-')
df
A B
0 3 A
1 5 A
2 0 -
3 2 B
4 6 B
5 9 B
6 0 -
7 3 C
8 4 C
Run Code Online (Sandbox Code Playgroud)
这是使用的一种方法np.where。我在这里使用数字标签,在有许多组的情况下可能更合适:
import numpy as np
m = df.eq(0)
df['A'] = np.where(m, '-', m.cumsum())
A
0 0
1 0
2 -
3 1
4 1
5 1
6 -
7 2
8 2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
81 次 |
| 最近记录: |