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