在熊猫数据框中使用 np.isclose 报告最接近的值

Posted

技术标签:

【中文标题】在熊猫数据框中使用 np.isclose 报告最接近的值【英文标题】:Reporting closest value using np.isclose in pandas dataframe 【发布时间】:2022-01-23 23:40:15 【问题描述】:

我目前有两个 DataFrame,一个有一个质量列表(列为'mass_pos' 列):

        entry  mass Precursor  Monoisotopic  mass_pos  masses match
0       KGTLP   110     KGTLP        581.69    691.69          True
1       KGTLP   125     KGTLP        581.69    706.69          True
2       KGTLP   133     KGTLP        581.69    714.69          True
3       KGTLP   139     KGTLP        581.69    720.69          True
4       KGTLP   153     KGTLP        581.69    734.69          True
      ...   ...       ...           ...       ...           ...
355675  GTKKP    42     GTKKP        596.70    638.70          True
355676  GTKKP    43     GTKKP        596.70    639.70          True
355677  GTKKP   210     GTKKP        596.70    806.70          True
355678  GTKKP   226     GTKKP        596.70    822.70          True
355679  GTKKP     0     GTKKP        596.70    596.70          True

另一个DataFrame如下所示:

      Mass
0  586.672
1  798.780
2  690.780
3  400.000
4  662.000

如您所见,我使用np.isclose 来查看第二个DataFrame 中是否有一个值在第一个DataFrame 中'mass_pos' 值的某个容差范围内,然后将布尔值附加到第一个DataFrame df。我就是这样做的:

tolerance = tol_in #provides margin of error
match_mass = lambda x: np.any(np.isclose(x, mass_q_sequence['Mass'], atol=tolerance))
df_seq2['masses match'] = df_seq2['mass_pos'].apply(match_mass)
df_seq2 = df_seq2[df_seq2['masses match'] == True] #remove all false rows from df

我意识到我需要计算一个 ppm 误差,这涉及到找到 'mass pos''mass' 值之间的误差,因此简单的布尔输出不再足够。有没有办法报告这些值之间的差异,或者将第二个 df 的匹配值附加到满足布尔值的第一个 df?

基本上我只需要报告第二个 df 中的什么值满足第一个中的布尔值。

【问题讨论】:

【参考方案1】:

如果我理解正确,您只想从第二个数据帧中找到最接近的值。

masses = mass_q_sequence['Mass']
mass_pos = df_seq2['mass_pos']
# using broadcasting and finding indices of closest mass for each mass_pos:
closest_mass_indices = np.argmin(np.abs(masses.reshape(1, -1) - mass_pos.reshape(-1, 1)), axis=1) 
df['closest_mass'] = masses[closest_mass_indices]

【讨论】:

我认为这会起作用,但是现在它抛出:ValueError: cannot reindex from a duplicate axis你知道如何克服这个吗? 也许作为另一个问题发布?无法判断可能出了什么问题,必须猜测(很可能是不正确的)出了什么问题。 最好 - 使用minimal, reproducible example。这样的例子更容易提供帮助 - 这样你几乎可以保证有人会帮助你。

以上是关于在熊猫数据框中使用 np.isclose 报告最接近的值的主要内容,如果未能解决你的问题,请参考以下文章

带有熊猫数据框输入的 sklearn 分类报告产生:“TypeError:并非所有参数都在字符串格式化期间转换”

使用熊猫在数据框中追加一个空行

如何在熊猫数据框中使用列表作为值?

如何在熊猫数据框中使用列表作为值?

在熊猫数据框中使用正则表达式替换列值

检查字符串是不是在熊猫数据框中