我有一个包含大量行和列的数据帧.下面的数据帧只是它的简化版本.

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

推荐答案

您可以从duplicated个值中减go cumsum:

# 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相关问答推荐

列表上值总和最多为K(以O(log n))的最大元素数

通过优化空间在Python中的饼图中添加标签

Select 用a和i标签包裹的复选框?

将整组数组拆分为最小值与最大值之和的子数组

Pandas 有条件轮班操作

按列分区,按另一列排序

图像 pyramid .难以创建所需的合成图像

Pandas—合并数据帧,在公共列上保留非空值,在另一列上保留平均值

如何在Polars中从列表中的所有 struct 中 Select 字段?

删除marplotlib条形图上的底边

基于行条件计算(pandas)

(Python/Pandas)基于列中非缺失值的子集DataFrame

如何从pandas DataFrame中获取. groupby()和. agg()之后的子列?

使用字典或列表的值组合

为什么t sns.barplot图例不显示所有值?'

Django Table—如果项目是唯一的,则单行

删除特定列后的所有列

如何用FFT确定频变幅值

使用Scikit的ValueError-了解

如何删除剪裁圆的对角线的外部部分