python - 如何通过列中的重复值自动递增计数器

标签 python pandas

我有一个包含name列的数据框,我需要创建seq列,它允许我识别名称在数据框中出现的不同时间,保持顺序很重要。

import pandas as pd  
  
data = {'name': ['Tom', 'Joseph','Joseph','Joseph', 'Tom', 'Tom', 'John','Tom','Tom','John','Joseph']
        , 'seq': ['Tom 0', 'Joseph 0','Joseph 0','Joseph 0', 'Tom 1', 'Tom 1', 'John 0','Tom 2','Tom 2','John 1','Joseph 1']}  
  
df = pd.DataFrame(data)  
  
print(df) 

      name       seq
0      Tom     Tom 0
1   Joseph  Joseph 0
2   Joseph  Joseph 0
3   Joseph  Joseph 0
4      Tom     Tom 1
5      Tom     Tom 1
6     John    John 0
7      Tom     Tom 2
8      Tom     Tom 2
9     John    John 1
10  Joseph  Joseph 1

最佳答案

创建一个 bool 掩码以了解名称是否较前一行发生更改。然后在按名称分组之前过滤掉序列的第二个、第三个……名称。 cumcount 递增序列号,最后连接名称和序列号。

# Boolean mask
m = df['name'].ne(df['name'].shift())

# Create sequence number
seq = df.loc[m].groupby('name').cumcount().astype(str) \
        .reindex(df.index, fill_value=pd.NA).ffill()

# Concatenate name and seq
df['seq'] = df['name'] + ' ' + seq

输出:

>>> df
      name       seq
0      Tom     Tom 0
1   Joseph  Joseph 0
2   Joseph  Joseph 0
3   Joseph  Joseph 0
4      Tom     Tom 1
5      Tom     Tom 1
6     John    John 0
7      Tom     Tom 2
8      Tom     Tom 2
9     John    John 1
10  Joseph  Joseph 1

>>> m
0      True
1      True
2     False
3     False
4      True
5     False
6      True
7      True
8     False
9      True
10     True
Name: name, dtype: bool

关于python - 如何通过列中的重复值自动递增计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71020748/

相关文章:

python - 未找到名为 vpc-xxxxxx-vpc-id 的导出。用户请求回滚

Python Selenium 在测试之间保持 chrome 打开

python - Pandas DataFrame 中索引和列的级别数(深度)

python - 需要刷新 Python 多处理队列

python - 在时间戳上加入两个不同的数据帧

python - Matplotlib 图没有出现

python - 使用 python pandas 查找另一个数据框并返回相应的值

python - 如何在 pandas 数据框中创建一个新列,并对每行中的字符串部分进行不同的替换?

python - 使用 pandas DataFrame 打开 JSON 文件

python - 用 pandas series.map(dict) 替换 NaN