标记Dataframe的行

时间:2018-02-21 12:57:25

标签: python pandas dataframe

我想基于以下条件向我的数据帧添加一个新属性“LabelId”:给定输入数据帧DF,找到k nlargest(k, velocity),并且对于我想要添加的每个值,并且取代某些ms,例如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

我一直在使用上述功能,但我没有得到正确的结果。 请,任何建议将非常感谢。 非常感谢, 最好的祝福, 卡罗

1 个答案:

答案 0 :(得分:1)

您需要按nlargest排名eventTime,然后添加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