使用df.apply()对一个time列执行操作,该列指示Pandas中每2秒的时间

wfauudbj  于 2022-11-20  发布在  其他
关注(0)|答案(2)|浏览(175)

我是这个数据科学世界的新手,正在尝试了解一些基本的Pandas例子。我有一个Pandas数据框,我想创建一个新的列,并添加一些条件值,如下所示:它将每隔2秒包含yes。否则包含no。以下是一个示例:这是我的原始数据框。

id  name    time
0   1   name1   260.123
1   2   name2   261.323
2   3   name3   261.342
3   4   name4   261.567
4   5   name5   262.123
...

新的数据框将如下所示:

id  name    time     time_delta
0   1   name1   260.123  yes
1   2   name2   261.323  no
2   3   name3   261.342  no
3   4   name4   261.567  no
4   5   name5   262.123  yes
5   6   name6   262.345  yes
6   7   name7   264.876  yes
7   8   name8   265.234  no
8   9   name9   266.234  yes
9   10  name10  267.234  no
...

我使用的代码是:df['time_delta'] = df['time'].apply(apply_test)函数的实际代码:

def apply_test(num):
    prev = num
    if round(num) != prev + 2:
        prev = prev
        return "no"
    else:
        prev = num
        return "yes"

请注意,时间列有小数,没有模式。
结果是所有的no,因为在每次迭代中prev被分配给下一个数字。这是我想的方式。不确定是否有其他更好的方式。我将感谢任何帮助。
最新消息:

  • 请注意,时间列有小数,在这种情况下,小数值没有值。例如,时间=234.xxx将被视为234秒。因此,下一个2秒点是236。
  • 如果我们向下取整,数据框会有多个秒值。在这种情况下,所有秒值都必须标记为yes。请参考更新结果数据框作为示例。
dsf9zpds

dsf9zpds1#

你可以检查当diff的累计和的剩余值除以2后的变化值,即当它进入一个长度为2的新段时:

remaining = (df['time'].diff().cumsum() // 2).fillna(0)
df['time_delta'] = np.where((~remaining.duplicated()), 'yes', 'no')
tgabmvqs

tgabmvqs2#

您可以用途:

import numpy as np

N = 2 # time step

# define bins every N seconds
bins = np.arange(np.floor(df['time'].min()), df['time'].max()+N, 2)
# get the index of the first row per group
idx = df.groupby(pd.cut(df['time'], bins))['time'].idxmin()

# assign "yes" to the first else "no"
df['timedelta'] = np.where(df.index.isin(idx), 'yes', 'no')

输出量:

id   name     time time_delta
0   1  name1  260.123        yes
1   2  name2  260.323         no
2   3  name3  261.342         no
3   4  name4  261.567         no
4   5  name5  262.123        yes
5   6  name6  263.345         no
6   7  name7  264.876        yes

相关问题