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

时间:2019-06-17 14:49:17

标签: python pandas dataframe

我的数据框如下:

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)

输出:

df
3
5
0
2
6
9
0
3
4

在df中出现0后出现新的“集群”。我想给每个群集一个唯一的值,像这样:

df
3    A
5    A
0    -
2    B
6    B
9    B
0    -
3    C
4    C

我尝试使用枚举和itertools,但是由于我是Python的新手,所以我一直在努力使用这些选项的正确用法和语法。

3 个答案:

答案 0 :(得分: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

可以使用views编写一个NumPy解决方案,并且应该很快:

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

从v0.22开始,您还可以通过熊猫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

答案 1 :(得分: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

答案 2 :(得分:3)

IIUC

import string
s=df.A.eq(0).cumsum()
d=dict(zip(s.unique(),string.ascii_uppercase[:s.max()+1]))
s.loc[df.A!=0].map(d).reindex(df.index,fill_value='-')
Out[360]: 
0    A
1    A
2    -
3    B
4    B
5    B
6    -
7    C
8    C
Name: A, dtype: object