繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM