簡體   English   中英

Pandas dataframe:將每列中的唯一值更改為 NaN

[英]Pandas dataframe: change unique values in each column to NaNs

我有一個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 替換所有唯一值(即所謂的“壞”)。 這需要對所有列完成。

換句話說,最終的 dataframe 應該是這樣的:

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

這意味着它需要對許多列重復(我在實際數據中有很多)。 有沒有更有效的解決方案?

使用DataFrame.where設置NaN s,其掩碼由Series.duplicated per columns in DataFrame.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

一種選擇是通過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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM