![](/img/trans.png)
[英]Pandas: for groups of rows where 2 or more particular columns values are exactly the same, how to assign a unique integer as a new column
[英]How to assign unique values to groups of rows in a pandas dataframe based on a condition?
我的数据框看起来像这样:
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
我尝试使用enumerate和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
可以使用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开始,你也可以通过pandas Series.view
来做到这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
这是使用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
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.