【问题标题】:How to add column label once one column reaches the value of another in pandas and calculate number of days it took to reach that value一旦一列在熊猫中达到另一列的值,如何添加列标签并计算达到该值所需的天数
【发布时间】:2021-09-08 01:32:43
【问题描述】:

我有一个不同 ID 的数据框,其中一列是固定值,另一列是可变的,按日期更改。我想查看每个 ID 并创建一个新列来标记它是否已达到固定值,并创建另一个列来计算达到该值所需的时间。

ID Date Fixed Value Varible Value
1 2021-01 500 10
1 2021-02 500 200
1 2021-03 500 300
1 2021-04 500 400
1 2021-05 500 500
2 2021-01 400 5
2 2021-02 400 20
2 2021-03 400 70
2 2021-04 400 400
2 2021-05 400 500
3 2021-01 300 10
3 2021-02 300 300
3 2021-03 300 500
3 2021-04 300 600
3 2021-05 300 700

我想要的是这样的:

ID Date Fixed Value Varible Value Reached_Fixed_Value Time_To_Reach
1 2021-01 500 10 No na
1 2021-02 500 200 No na
1 2021-03 500 300 No na
1 2021-04 500 400 No na
1 2021-05 500 500 Yes 5 months
2 2021-01 400 5 No na
2 2021-02 400 20 No na
2 2021-03 400 70 No na
2 2021-04 400 400 Yes 4 months
2 2021-05 400 500 Yes 4 months
3 2021-01 300 10 No na
3 2021-02 300 300 Yes 2 months
3 2021-03 300 500 Yes 2 months
3 2021-04 300 600 Yes 2 months
3 2021-05 300 700 Yes 2 months

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 你可能需要 groupby 和 cumsum ...你应该尝试一些东西,一旦你付出了一些努力就回来(也许你已经这样做了,在这种情况下你应该发布你的尝试以及为什么它错了)

标签: python pandas


【解决方案1】:

IIUC,你可以这样做:

df['Date'] = pd.to_datetime(df['Date'], format='%Y-%m')

df["Reached_Fixed_Value"] = np.where(
    (df["Varible Value"] >= df["Fixed Value"]), "Yes", "No"
)
df["Time_To_Reach"] = (
    df.query('Reached_Fixed_Value == "Yes"')
      .groupby("ID")["Date"]
      .transform("min")
      .dt.strftime("%m")
      .str.strip("0") + " months"
)
df

输出:

    ID       Date  Fixed Value  Varible Value Reached_Fixed_Value Time_To_Reach
0    1 2021-01-01          500             10                  No           NaN
1    1 2021-02-01          500            200                  No           NaN
2    1 2021-03-01          500            300                  No           NaN
3    1 2021-04-01          500            400                  No           NaN
4    1 2021-05-01          500            500                 Yes      5 months
5    2 2021-01-01          400              5                  No           NaN
6    2 2021-02-01          400             20                  No           NaN
7    2 2021-03-01          400             70                  No           NaN
8    2 2021-04-01          400            400                 Yes      4 months
9    2 2021-05-01          400            500                 Yes      4 months
10   3 2021-01-01          300             10                  No           NaN
11   3 2021-02-01          300            300                 Yes      2 months
12   3 2021-03-01          300            500                 Yes      2 months
13   3 2021-04-01          300            600                 Yes      2 months
14   3 2021-05-01          300            700                 Yes      2 months

有时间计算:

df["Time_To_Reach"] = (
    ((df.query('Reached_Fixed_Value == "Yes"')['Date'] - df.groupby("ID")["Date"]
      .transform("min")) / np.timedelta64(1, 'M')).round().add(1).cummin()
      )
df

输出:

    ID       Date  Fixed Value  Varible Value Reached_Fixed_Value  Time_To_Reach
0    1 2021-01-01          500             10                  No            NaN
1    1 2021-02-01          500            200                  No            NaN
2    1 2021-03-01          500            300                  No            NaN
3    1 2021-04-01          500            400                  No            NaN
4    1 2021-05-01          500            500                 Yes            5.0
5    2 2021-01-01          400              5                  No            NaN
6    2 2021-02-01          400             20                  No            NaN
7    2 2021-03-01          400             70                  No            NaN
8    2 2021-04-01          400            400                 Yes            4.0
9    2 2021-05-01          400            500                 Yes            4.0
10   3 2021-01-01          300             10                  No            NaN
11   3 2021-02-01          300            300                 Yes            2.0
12   3 2021-03-01          300            500                 Yes            2.0
13   3 2021-04-01          300            600                 Yes            2.0
14   3 2021-05-01          300            700                 Yes            2.0

【讨论】:

  • 是的,进行字符串转换。否则,需要做一些花哨的月份计算并加 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-02
  • 1970-01-01
  • 2021-09-30
  • 1970-01-01
  • 2022-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多