python - Pandas 数据帧 : change duplicated rows so the first duplicates are in consecutive order

标签 python pandas dataframe

我有一个包含大量行和列的数据框。以下数据框只是其简化版本。

dct = {'day': ['Mon', 'Tue', 'Wed', 'Wed', 'Thur', 'Fri', 'Fri', 'Sat', 'Sun'],
       'id': ['1', '2', '3', '4', '5', 
              '6', '7', '8', '9']}

df = pd.DataFrame(dct)
    day id
0   Mon  1
1   Tue  2
2   Wed  3
3   Wed  4
4  Thur  5
5   Fri  6
6   Fri  7
7   Sat  8
8   Sun  9

我想更改 id 以匹配重复的日期(在这种情况下),但仍然是连续的。

    day id
0   Mon  1
1   Tue  2
2   Wed  3
3   Wed  3
4  Thur  4
5   Fri  5
6   Fri  5
7   Sat  6
8   Sun  7

到目前为止,我设法更改了 id,但它们不是连续的,我现在有点卡住了。

m = df['day'].duplicated()
df['id'] = df['id'].mask(m).ffill()
    day id
0   Mon  1
1   Tue  2
2   Wed  3
3   Wed  3
4  Thur  5
5   Fri  6
6   Fri  6
7   Sat  8
8   Sun  9

最佳答案

您可以减去 cumsum duplicated的值:

# ensure using numeric dtype
df['id'] = df['id'].astype(int)

# subtract duplicated cumsum
df['id'] -= df['day'].duplicated().cumsum()

输出:

    day  id
0   Mon   1
1   Tue   2
2   Wed   3
3   Wed   3
4  Thur   4
5   Fri   5
6   Fri   5
7   Sat   6
8   Sun   7

中间体:

    day  id  duplicated  cumsum  id-cumsum
0   Mon   1       False       0          1
1   Tue   2       False       0          2
2   Wed   3       False       0          3
3   Wed   4        True       1          3
4  Thur   5       False       1          4
5   Fri   6       False       1          5
6   Fri   7        True       2          5
7   Sat   8       False       2          6
8   Sun   9       False       2          7

关于python - Pandas 数据帧 : change duplicated rows so the first duplicates are in consecutive order,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76199641/

相关文章:

python - 在 AWS 上运行 python 脚本的建议

python-3.x - 如何使用 IQR 从 DataFrame 中删除异常值?

python:如何提高合并两个DataFrame的速度?

python - Pandas 过滤并转换为日期到 datetime64ns

python - 为什么 'na_values' 在 Pandas 中不能正常工作?

python - 修改异常消息而不丢失引发堆栈

python - python中的多重递归是如何工作的

python - CFD 边界条件

python - 删除 Pandas Dataframe 中按其他列分组的列中频率最低的行

python - 在 Python 字符串中转义 %E