【问题标题】:How to get the timestamp of the next row meeting a condition after a specific row in pandas如何在熊猫中的特定行之后获取满足条件的下一行的时间戳
【发布时间】:2023-02-06 00:23:07
【问题描述】:

我有一个 df,其中包含时间列“t”、“第一”和“第二”。 (这里为了简单起见,我在 t 列中使用了数字,但它们将是日期时间对象或日期字符串)

t   first   second
1   grey    red
2   green   red
3   red     red
4   grey    green
5   green   red
6   grey    green
7   green   red
8   red     red

它可以这样创建:

import pandas as pd

dfx = pd.DataFrame(
    {
        'time': [1,2,3,4,5,6,7,8],
        'first': ['grey', 'green', 'red', 'grey', 'green', 'grey', 'green', 'red'], 
        'second': ['red', 'red', 'red', 'green', 'red', 'green', 'red', 'red']
    }
)

我需要选择第一个等于绿色的行,然后添加下一个第二个等于绿色的行。生成的 df 将如下所示:

t   first   t_second
2   green   4
5   green   6
7   green   NaN

我怎么能做到这一点?

我发现了一个类似的问题here,但它涉及布尔值。我并不完全理解答案,但据我所知,它不能以类似的方式处理多个分类值。我也无法转换为布尔值,因为我将在颜色类别中有多个选项。

【问题讨论】:

  • 如果在 second 中有一个绿色之前 first 中有 2 个绿色怎么办?这 2 个果岭会得到相同的 t_second 值吗?而且我假设您想对所有颜色都这样做,而不仅仅是绿色?

标签: python pandas dataframe


【解决方案1】:

让我们从对 second 列进行单热编码开始:

>>> pd.get_dummies(df.set_index("t")["second"])

   green  red
t            
1      0    1
2      0    1
3      0    1
4      1    0
5      0    1
6      1    0
7      0    1
8      0    1

然后将 greenredt 相乘,这样我们基本上将 t 分解为 greenred

>>> _ * df["t"].to_numpy()[:, None]

   green  red
t            
1      0    1
2      0    2
3      0    3
4      4    0
5      0    5
6      6    0
7      0    7
8      0    8

现在,如果我们用下一个非零值,我们将得到想要的结果。

>>> # fill 0 with the next non-zero value #

   green  red
t            
1      4    1
2      4    2
3      4    3
4      4    5
5      6    5
6      6    7
7    nan    7
8    nan    8

这意味着从t = 1开始,green的下一次出现是在t = 4。我们现在只需要将它连接到原始数据框就可以得到我们想要的东西。


代码:

tmp = (
    pd.get_dummies(df.set_index("t")["second"])
    .mul(df["t"].to_numpy()[:, None])
    .replace(0, np.nan)
    .bfill()
    .rename_axis(columns="second")
    .stack()
    .rename("t_second")
)

df.merge(tmp, how="left", left_on=["t", "first"], right_on=["t", "second"])

这假设 t != 0,您的真实数据可能就是这种情况。

【讨论】:

    猜你喜欢
    • 2023-01-31
    • 2020-10-11
    • 2016-08-22
    • 1970-01-01
    • 2022-07-22
    • 2020-11-04
    • 2018-03-11
    • 1970-01-01
    • 2019-11-13
    相关资源
    最近更新 更多