【问题标题】:Count of unique rows based on preceding row - Pandas基于前一行的唯一行数 - Pandas
【发布时间】:2020-03-07 16:03:09
【问题描述】:

我想从 df 的多个列中返回唯一行。问题是如果它们没有出现在上一行中,我想包含相同的值集。这有点难以解释,所以我会展示它;

df = pd.DataFrame({   
        'Time' : ['2019-08-02 09:50:10.1','2019-08-02 09:50:10.2','2019-08-02 09:50:10.3','2019-08-02 09:50:10.4','2019-08-02 09:50:10.5','2019-08-02 09:50:10.6','2019-08-02 09:50:10.7','2019-08-02 09:50:10.8','2019-08-02 09:50:10.9','2019-08-02 09:50:11.0'],
        'Code1' : ['A','A','B','B','C','C','A','A','B','B'],    
        'Code2' : ['B','B','A','A','B','B','B','B','A','A'],    
        'Code3' : [np.nan,np.nan,'C','C','A','A','C','C','C','C'],                                   
        })


df = df[df.iloc[:, 1:].shift().ne(df.iloc[:, 1:]).any(axis=1)].reset_index(drop = True)

预期输出:

                    Time Code1 Code2 Code3
0  2019-08-02 09:50:10.1     A     B   NaN
1  2019-08-02 09:50:10.3     B     A     C
2  2019-08-02 09:50:10.5     C     B     A
3  2019-08-02 09:50:10.7     A     B     C
4  2019-08-02 09:50:10.9     B     A     C

【问题讨论】:

    标签: python pandas pandas-groupby


    【解决方案1】:

    您可以为空值使用标记值,然后对结果进行分组。

    groupbyshift-cumsum pattern 的变体。

    sentinel = 99999999
    mask = df[cols].fillna(sentinel).ne(df[cols].fillna(sentinel).shift())
    >>> df.groupby(
            mask.any(axis=1).cumsum(), 
            sort=False,
            as_index=False
        ).first()
                        Time Code1 Code2 Code3
    0  2019-08-02 09:50:10.1     A     B   NaN
    1  2019-08-02 09:50:10.3     B     A     C
    2  2019-08-02 09:50:10.5     C     B     A
    3  2019-08-02 09:50:10.7     A     B     C
    4  2019-08-02 09:50:10.9     B     A     C
    

    【讨论】:

      【解决方案2】:

      首先我们使用iloc 选择正确的列,然后我们使用shift 来检查当前行是否不等于下一行。最后我们使用any 而不是axis=1 (columns)。因为A B CB A C 不同,但有C 的共同点:

      df[df.iloc[:, 1:].shift().ne(df.iloc[:, 1:]).any(axis=1)]
      

      或相同,但写得不太简洁:

      mask = df.iloc[:, 1:].shift().ne(df.iloc[:, 1:])
      df[mask.any(axis=1)]
      
                          Time Code1 Code2 Code3
      0  2019-08-02 09:50:10.1     A     B     C
      2  2019-08-02 09:50:10.3     B     A     C
      4  2019-08-02 09:50:10.5     C     B     A
      6  2019-08-02 09:50:10.7     A     B     C
      8  2019-08-02 09:50:10.9     B     A     C
      

      【讨论】:

      • 谢谢@Erfan,但是 df 包含的 NaN 值是什么?我将更新示例 df。
      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 2017-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-29
      相关资源
      最近更新 更多