[英]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
我考虑过的一个可能的解决方案涉及groupby
和filter
以获取索引值(如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.