【问题标题】:Labelling the rows of a Dataframe标记数据框的行
【发布时间】:2018-02-21 21:45:39
【问题描述】:

我想根据以下条件向我的数据框添加一个新属性“LabelId”:给定输入数据框 DF,找到 k nlargest(k, velocity) 并为每个值添加和减去一些毫秒,例如50 通过应用 apply(lambda x: x - np.timedelta64( 50, 'ms' ) )apply(lambda x: x + np.timedelta64( 50, 'ms' ) ) 并将新属性 LabelId 设置为 1 否则设置为 0。

输入DF:考虑速度列的2个最大值并加上50 ms。

    eventTime,               velocity
1,  2017-08-19T12:53:55:050,  3
2,  2017-08-19T12:53:55:100,  4
3,  2017-08-19T12:53:55:150, 180
4,  2017-08-19T12:53:55:200,  2
5,  2017-08-19T12:53:55:250,  5
6,  2017-08-19T12:53:55:050,  3
7,  2017-08-19T12:53:55:100,  4
8,  2017-08-19T12:53:55:150, 70
9,  2017-08-19T12:53:55:200,  2
10, 2017-08-19T12:53:55:250,  5

输出DF:

    eventTime,               velocity, LabelId
1,  2017-08-19T12:53:55:050,  3,        0
2,  2017-08-19T12:53:55:100,  4,        1
3,  2017-08-19T12:53:55:150, 180,       1 
4,  2017-08-19T12:53:55:200,  2,        1
5,  2017-08-19T12:53:55:250,  5,        0
6,  2017-08-19T12:53:55:050,  3,        0
7,  2017-08-19T12:53:55:100,  4,        1
8,  2017-08-19T12:53:55:150, 70,        1
9,  2017-08-19T12:53:55:200,  2,        1
10, 2017-08-19T12:53:55:250,  5,        0

我一直在使用上述功能,但没有得到正确的结果。 请,任何建议将不胜感激。 非常感谢, 此致, 卡罗

【问题讨论】:

  • 你能用更人性化的方式描述一下LabelId是什么意思吗?在该列中1 是什么意思,0 是什么意思?
  • 好的,当然。 0 表示“写作”,“1”表示“阅读”。但我不清楚这对解决方案有何影响。

标签: python pandas dataframe


【解决方案1】:

您需要通过nlargesteventTime 置顶,然后添加Timedelta 并获得最大和最小时间戳。最后由between 创建掩码,将其转换为整数01

df['eventTime'] = pd.to_datetime(df['eventTime'], format='%Y-%m-%dT%H:%M:%S:%f')

a = df.nlargest(2, 'velocity')['eventTime']
low = min(a) - pd.Timedelta(50, unit='ms')
high = max(a) + pd.Timedelta(50, unit='ms')

#low   2017-08-19 12:53:55.100
#high   2017-08-19 12:53:55.200

df['LabelId'] = df['eventTime'].between(low,high).astype(int)
print (df)

返回

                 eventTime  velocity  LabelId
1  2017-08-19 12:53:55.050         3        0
2  2017-08-19 12:53:55.100         4        1
3  2017-08-19 12:53:55.150       180        1
4  2017-08-19 12:53:55.200         2        1
5  2017-08-19 12:53:55.250         5        0
6  2017-08-19 12:53:55.050         3        0
7  2017-08-19 12:53:55.100         4        1
8  2017-08-19 12:53:55.150        70        1
9  2017-08-19 12:53:55.200         2        1
10 2017-08-19 12:53:55.250         5        0

【讨论】:

  • 谢谢耶兹瑞尔。一个问题:nlargest中使用的数字2与a1和a2之间有什么关系吗?如果我在 nlargest 中使用 10,我应该改变什么吗?原因是我在应用 df['LabelId'] = df['eventTime'].isin(a).astype(int) 时只得到 0。
  • @CarloAllocca - 我认为您需要具有最高时间戳+-50ms 的最大值和最小值之间的所有值?我编辑答案。
  • 我正在努力在我的数据上获得正确的结果。基本上,我只在最小值和最大值之间得到 1,而不是在上面显示的每个部分中。我正在使用 = df.nlargest(15, 'velocity')['eventTime']
  • @CarloAllocca - 获取 lowhigh 值有问题吗?
  • 问题是 DF 仅在低和高之间被标记为 1。只有一节 s(from_low, to_high)。我希望有 15 个部分。
猜你喜欢
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-24
  • 1970-01-01
  • 2020-04-13
相关资源
最近更新 更多