Pandas:如何按没有完全匹配的相关列组合数据框,以及可能的内部重复?

这个问题与Pandas相关,但不完全相同:如何通过最接近的索引匹配组合两个数据帧?.


给定两个数据框df1[['A1', 'B1']]和df2[['A2', 'B2']],我想将它们组合起来,所以我最终得到了一个数据框df3[['A2, 'B2', 'B1', 'A1']],其中 的等位基因值'A1'已与最接近'B2'的'B1'. 下面是一个示例,您会在最后找到完整的数据示例和可重现的代码。


df1:(重复 B1 = -9.33)


       A1     B1

0 -128.65 -12.30

1 -117.74 -11.98

2 -117.19 -11.91

3 -109.43 -10.03

4  -93.75  -9.33

5  -87.27  -9.33

6  -85.59  -5.96

7  -76.18  -5.51

df2:


       A2     B2

0  -69.06 -12.64

1  -86.88 -12.12

2  -95.95 -11.35

3 -103.87 -10.67

4 -105.78  -9.63

5 -108.11  -9.20

6 -111.07  -9.06

7 -126.42  -6.37

请注意 df2['A2'] 正在下降,而所有其他列都在上升。


期望的输出:


       A2     B2     B1   A1

0  -69.06 -12.64 -12.30 -128.65  

1  -86.88 -12.12 -11.98 -117.74  

2  -95.95 -11.35 -10.03 -109.43

3 -103.87 -10.67 -10.03 -109.43 

4 -105.78  -9.63  -9.33 -87.27  

5 -108.11  -9.20  -9.33 -87.27

6 -111.07  -9.06  -5.96 -85.59

7 -126.42  -6.37  -5.96 -85.59

注意事项:


的正确匹配df2['B2']=-12.12是df1['B1']=-11.98对应的df['A1']=-117.74,因为df2['B2']=-12.12大于df2['B2']=-12.30并且-11.98是列中的下一步。


对于重复值df1['B1'].iloc[4] = df1['B1'].iloc[5] = -9.33,df1['A1'] = -87.27是正确的匹配,因为它是最大的值。


如果最佳解决方案包括将某些列设置为索引,我根本不介意!


这是一个可重现的片段:


#imports

import numpy as np

import pandas as pd


# Some sample data

np.random.seed(1234)


data1 = {'A1':sorted(np.random.normal(100, 20, 8)*-1),

         'B1':sorted(np.random.normal(10, 2, 8)*-1)}



data2 = {'A2':sorted(np.random.normal(100, 20, 8)*-1,reverse = True),

         'B2':sorted(np.random.normal(10, 2, 8)*-1)}


# Two dataframes

df1 = pd.DataFrame(data1).round(2)

df2 = pd.DataFrame(data2).round(2)


# Duplicate scenario 1: Duplicate A1 values

df1['B1'].iloc[4] = df1['B1'].iloc[5]

感谢您的任何建议!


慕斯709654
浏览 111回答 1
1回答

九州编程

这是pd.merge_asof在首先处理重复项之后。排序'A1'然后在 上删除重复项'B1','A1'为每个唯一的留下最大的值'B1':import pandas as pd#df2 = df2.sort_values('B2') # If not sorted by `B2`pd.merge_asof(df2,               df1.sort_values('A1').drop_duplicates('B1', keep='last').sort_values('B1'),              left_on='B2', right_on='B1', direction='forward')输出:       A2     B2      A1     B10  -69.06 -12.64 -128.65 -12.301  -86.88 -12.12 -117.74 -11.982  -95.95 -11.35 -109.43 -10.033 -103.87 -10.67 -109.43 -10.034 -105.78  -9.63  -87.27  -9.335 -108.11  -9.20  -85.59  -5.966 -111.07  -9.06  -85.59  -5.967 -126.42  -6.37  -85.59  -5.96如果您需要保持原来的顺序,可以考虑重置索引,以便在合并后将其添加为列,然后将其设置回原位并对索引进行排序。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python