【问题标题】:Pandas dataframe: change unique values in each column to NaNsPandas 数据框:将每列中的唯一值更改为 NaN
【发布时间】:2023-01-10 15:31:08
【问题描述】:

我有一个 DataFrame 以类似于这样的方式排列:

ID   Sample_1   Sample_2
A    0.182      0.754
B    0.182      0.754
C    0.182      0.01
D    0.182      0.2
E    0.9        0.2

如您所见,有一些重复值(“真实”测量值)和单个值(实际上是“坏”测量值)。我需要做的是用 NA 替换所有唯一值(即所谓的“坏”)。这需要对所有列完成。

换句话说,最终的数据框应该是这样的:

ID   Sample_1   Sample_2
A    0.182      0.754
B    0.182      0.754
C    0.182      NaN
D    0.182      0.2
E    NaN        0.2

我考虑过的一个可能的解决方案涉及 groupbyfilter 以获取索引值(如 Get indexes of unique values in column (pandas))然后替换值,但问题是它一次仅适用于一列:

unique_loc = df.groupby("Sample_1").filter(lambda x: len(x) == 1).index
df.loc[unique_loc, "Sample_1"] = np.nan

这意味着它需要对许多列重复(我在实际数据中有很多)。有没有更有效的解决方案?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用DataFrame.where来设置NaNs,掩码由Series.duplicatedDataFrame.apply中的每列创建,用于选择所有列而不首先使用DataFrame.iloc

    df.iloc[:, 1:]=df.iloc[:, 1:].where(df.iloc[:, 1:].apply(lambda x:x.duplicated(keep=False)))
    print (df)
      ID  Sample_1  Sample_2
    0  A     0.182     0.754
    1  B     0.182     0.754
    2  C     0.182       NaN
    3  D     0.182     0.200
    4  E       NaN     0.200
    

    如果 ID 是索引:

    df = df.set_index('ID')
    
    df = df.where(df.apply(lambda x: x.duplicated(keep=False)))
    print (df)
        Sample_1  Sample_2
    ID                    
    A      0.182     0.754
    B      0.182     0.754
    C      0.182       NaN
    D      0.182     0.200
    E        NaN     0.200
    

    【讨论】:

      【解决方案2】:

      一种选择是通过np.unique获取值,并将它们替换为pd.DataFrame.mask

      arr, counts = np.unique(df.filter(like='Sample').to_numpy(), return_counts=True)
      df.mask(df.isin(arr[counts==1]))
      
        ID  Sample_1  Sample_2
      0  A     0.182     0.754
      1  B     0.182     0.754
      2  C     0.182       NaN
      3  D     0.182     0.200
      4  E       NaN     0.200
      
      

      【讨论】:

      • +1 但不单独考虑列,但可以通过对 numpy 数组进行一些重塑来实现
      猜你喜欢
      • 2020-10-22
      • 2021-06-19
      • 1970-01-01
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多