在熊猫数据框中使用 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 报告最接近的值的主要内容,如果未能解决你的问题,请参考以下文章