[英]How to remove unchanged values from a timestamped pandas dataframe?
所以我有以下熊猫数据框,按时间戳升序排序:
Timestamp,Point,Value
2019-09-01,A,1
2019-09-01,B,2
2019-09-02,A,1
2019-09-02,B,2
2019-09-03,A,3
2019-09-03,B,4
2019-09-04,A,3
2019-09-04,B,4
2019-09-05,A,1
2019-09-05,B,2
该数据帧包含对不同时刻不同“点”值的读取。 在此示例中,A 和 B 每 1 天有一次读数,但其中一些值与之前的读数相同。
我需要应用一个转换,该转换将只留下 Value 列与同一点的先前读数发生变化的行。
|Timestamp |Point|Value|
|----------|-----|-----|
|2019-09-01|A |1 | // A = 1
|2019-09-01|B |2 | // B = 2
|2019-09-02|A |1 | // A unchanged, should be removed
|2019-09-02|B |2 | // B unchanged, should be removed
|2019-09-03|A |3 | // A = 3
|2019-09-03|B |4 | // B = 4
|2019-09-04|A |3 | // A unchanged, should be removed
|2019-09-04|B |4 | // B unchanged, should be removed
|2019-09-05|A |1 | // A = 1
|2019-09-05|B |2 | // B = 2
在这个简化的示例中,我想要获得如下所示的数据帧。 仅包括与同一点的先前读数不同的值。
|Timestamp |Point|Value|
|----------|-----|-----|
|2019-09-01|A |1 |
|2019-09-01|B |2 |
|2019-09-03|A |3 |
|2019-09-03|B |4 |
|2019-09-05|A |1 |
|2019-09-05|B |2 |
您可以重塑数据框以将唯一的时间戳记作为行,将点作为列,然后检查是否有更改,否则分配 nan 和stack()
:
m = df.set_index(['Timestamp','Point']).unstack().where(lambda x:
x.ne(x.shift())).stack().reset_index()
或者分成两行:
m = df.set_index(['Timestamp','Point']).unstack()
m = m.where(m.ne(m.shift())).stack().reset_index()
print(m)
Timestamp Point Value
0 2019-09-01 A 1.0
1 2019-09-01 B 2.0
2 2019-09-03 A 3.0
3 2019-09-03 B 4.0
4 2019-09-05 A 1.0
5 2019-09-05 B 2.0
您可以尝试布尔索引,首先按Timestamp
、 groupby Point
排序并检查Value
diff
(连续两行之间的diff
)不等于0
:
df[df.sort_values('Timestamp').groupby('Point')['Value'].diff().ne(0)]
[出去]
Timestamp Point Value
0 2019-09-01 A 1
1 2019-09-01 B 2
4 2019-09-03 A 3
5 2019-09-03 B 4
8 2019-09-05 A 1
9 2019-09-05 B 2
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.