【问题标题】:How to remove unchanged values from a timestamped pandas dataframe?如何从带时间戳的熊猫数据框中删除未更改的值?
【发布时间】:2020-01-23 19:40:33
【问题描述】:

所以我有以下熊猫数据框,按时间戳升序排序:

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    |

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    您可以重塑数据框,使其具有唯一的 Timestamps 作为 row 和 Points 作为 columns ,然后检查是否有变化,否则分配 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
    

    【讨论】:

      【解决方案2】:

      您可以尝试布尔索引,首先按Timestamp 排序,然后按Point 分组并检查Valuediff(连续2 行之间的差)不等于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
      

      【讨论】:

        猜你喜欢
        • 2018-08-18
        • 2018-02-02
        • 2020-01-19
        相关资源
        最近更新 更多