【问题标题】:Creating an accumulative column based on another column that only accumulates for a new ID基于仅针对新 ID 累积的另一列创建累积列
【发布时间】:2020-09-29 17:59:14
【问题描述】:

我有以下数据集:

Time = ['00:01', '00:02','00:03','00:01','00:02','00:03','00:01','00:02','00:03']
ID = [1, 1, 1, 2, 2, 2, 3, 3, 3]
Value = [3.5, 3.5, 3.5, 4.1, 4.1, 4.1, 2.3, 2.3, 2.3]   
df = pd.DataFrame({'Time':Time, 'ID':ID, 'Value':Value})

每个 ID 的每个值都相同。我想创建一个新列,累积累加 Value 列,但仅在每个 ID 更改时。 V

所以不是得到

3.5   7   10.5   14.6   18.7   22.8   25.1   27.3   29.5

我想要

3.5   3.5   3.5   7.6   7.6   7.6   9.9   9.9   9.9

【问题讨论】:

  • 相同 ID 的值是否相同?
  • 是的。我更新了。

标签: python pandas dataframe calculated-columns


【解决方案1】:

使用.loc 分配您的值,

shift测试ID变化的地方

然后 cumsumffill

df.loc[:, "Val"] = df[df["ID"].ne(df["ID"].shift())][
    "Value"
].cumsum()

df['Val'] = df['Val'].ffill()

print(df)

    Time  ID  Value  Val
0  00:01   1    3.5  3.5
1  00:02   1    3.5  3.5
2  00:03   1    3.5  3.5
3  00:01   2    4.1  7.6
4  00:02   2    4.1  7.6
5  00:03   2    4.1  7.6
6  00:01   3    2.3  9.9
7  00:02   3    2.3  9.9
8  00:03   3    2.3  9.9

或者更简单地按照 Ch3steR 的建议

df['Value'].where(df['Value'].ne(df['Value'].shift(1))).cumsum().ffill()

0    3.5
1    3.5
2    3.5
3    7.6
4    7.6
5    7.6
6    9.9
7    9.9
8    9.9

【讨论】:

  • df['Value'] = df['Value'].where(df['Value'].ne(df['Value'].shift(1))).ffill() 我想出了同样的方法,但速度要快得多。 :P
  • 我搞砸了。我的意思是说你快得多,但最后你发布了快得多。对不起,如果这很粗鲁。不介意请张贴。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 2018-04-09
  • 1970-01-01
  • 2011-11-29
相关资源
最近更新 更多