如何根据条件为熊猫数据框中的行组分配唯一值?

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新手,所以我一直在努力使用这些选项的正确用法和语法。

cs9*_*s95 5

您可以通过使用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)


yat*_*atu 5

这是使用的一种方法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)