亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Pandas:如何按沒有完全匹配的相關列組合數據框,以及可能的內部重復?

Pandas:如何按沒有完全匹配的相關列組合數據框,以及可能的內部重復?

慕斯709654 2021-12-17 10:45:30
這個問題與Pandas相關,但不完全相同:如何通過最接近的索引匹配組合兩個數據幀?.給定兩個數據框df1[['A1', 'B1']]和df2[['A2', 'B2']],我想將它們組合起來,所以我最終得到了一個數據框df3[['A2, 'B2', 'B1', 'A1']],其中 的等位基因值'A1'已與最接近'B2'的'B1'. 下面是一個示例,您會在最后找到完整的數據示例和可重現的代碼。df1:(重復 B1 = -9.33)       A1     B10 -128.65 -12.301 -117.74 -11.982 -117.19 -11.913 -109.43 -10.034  -93.75  -9.335  -87.27  -9.336  -85.59  -5.967  -76.18  -5.51df2:       A2     B20  -69.06 -12.641  -86.88 -12.122  -95.95 -11.353 -103.87 -10.674 -105.78  -9.635 -108.11  -9.206 -111.07  -9.067 -126.42  -6.37請注意 df2['A2'] 正在下降,而所有其他列都在上升。期望的輸出:       A2     B2     B1   A10  -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.433 -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.276 -111.07  -9.06  -5.96 -85.597 -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是正確的匹配,因為它是最大的值。如果最佳解決方案包括將某些列設置為索引,我根本不介意!這是一個可重現的片段:#importsimport numpy as npimport pandas as pd# Some sample datanp.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 dataframesdf1 = pd.DataFrame(data1).round(2)df2 = pd.DataFrame(data2).round(2)# Duplicate scenario 1: Duplicate A1 valuesdf1['B1'].iloc[4] = df1['B1'].iloc[5]感謝您的任何建議!
查看完整描述

1 回答

?
九州編程

TA貢獻1785條經驗 獲得超4個贊

這是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     B1

0  -69.06 -12.64 -128.65 -12.30

1  -86.88 -12.12 -117.74 -11.98

2  -95.95 -11.35 -109.43 -10.03

3 -103.87 -10.67 -109.43 -10.03

4 -105.78  -9.63  -87.27  -9.33

5 -108.11  -9.20  -85.59  -5.96

6 -111.07  -9.06  -85.59  -5.96

7 -126.42  -6.37  -85.59  -5.96

如果您需要保持原來的順序,可以考慮重置索引,以便在合并后將其添加為列,然后將其設置回原位并對索引進行排序。


查看完整回答
反對 回復 2021-12-17
  • 1 回答
  • 0 關注
  • 141 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號