簡體   English   中英

Pandas 按兩列中的值連接數據幀

[英]Pandas concat dataframes by values in two columns

我正在嘗試使用 dataframe 中兩列中的值創建一個 dataframe ,它們的外觀如下:

df1

W          F1        F2
0        'AB CD'   'RS TU'
0        'BC EF'   'GH IJ'
1        'BC EF'   'NO PQ'
0        'GH IJ'   'AB CD'
1        'KL MN'   'RS TU'
0        'NO PQ'   'UV WX'
...

df2

  F1         F2        BO_F1         BO_F2
'AB CD'   'GH IJ'       -150          500  
'BC EF'   'TG IP'        265         -150
'BC EF'   'NO PQ'       -500          250
'BC EF'   'GH IJ'        600         -700
'KL MN'   'PP UY'        150         -600 
'RS TU'   'AB CD'       -400          350
...

我想要的是:

W          F1        F2        BO_F1         BO_F2
0        'AB CD'   'RS TU'      -400          350
0        'BC EF'   'GH IJ'       600         -700
1        'BC EF'   'NO PQ'      -500          250
0        'GH IJ'   'AB CD'      -150          500
1        'KL MN'   'RS TU'      -600          700
0        'NO PQ'   'UV WX'       350         -900

我想根據列F1F2的值將列BO_F1BO_F2從 df2 合並到 df1 。 我遇到的主要問題是某些值的組合被交換,例如在 df1 中, F1F2的第一個組合是AB CDRS TU但 df2 中的這些值被交換,也就是說, F1F2RS TUAB CD

我怎樣才能做到這一點?

df1.set_index('F1').join(df2.set_index('F2'))

這行得通嗎? 我不確定我是否正確理解了問題

我想如果我理解正確的話,你只關心基於 F1 和 F2 列的元素合並觀察,而不管它們的順序。 下面我對兩個數據框中的 F1 和 F2 列進行排序(跨列而不是行排序),然后合並這些新列。

import pandas as pd
import numpy as np

df1 = pd.DataFrame([
[0,        'AB CD',   'RS TU'],
[0,        'BC EF',   'GH IJ'],
[1,        'BC EF',   'NO PQ'],
[0,        'GH IJ',   'AB CD'],
[1,        'KL MN',   'RS TU'],
[0,        'NO PQ',   'UV WX']],
columns=['W', 'F1', 'F2']
)

df2 = pd.DataFrame([
['AB CD',   'GH IJ', -150, 500],
['BC EF',   'TG IP', 265, -150],
['BC EF',   'NO PQ', -500, 250],
['BC EF',   'GH IJ', 600, -700],
['KL MN',   'PP UY', 150, -600],
['RS TU',   'AB CD', -400, 350]],
columns=['F1', 'F2', 'B0_F1', 'B0_F2']
)

ix1 = pd.DataFrame(np.sort(df1[['F1', 'F2']].values, axis=1),
    columns=['F1', 'F2'])
df1_sorted = pd.concat([df1[[c for c in df1.columns if c not in ['F1', 'F2']]],
                 ix1], axis=1, sort=False)

ix2 = pd.DataFrame(np.sort(df2[['F1', 'F2']].values, axis=1),
    columns=['F1', 'F2'])
df2_sorted = pd.concat([df2[[c for c in df2.columns if c not in ['F1', 'F2']]],
                 ix2], axis=1, sort=False)

df3 = pd.merge(df1_sorted, df2_sorted, on=['F1', 'F2'], how='left')

您可以為W每個值獨立使用DataFrame.merge ,然后您可以使用pd.concat

df=df1.reset_index() # to sort values at the end
w_mask=df1['W'].eq(1)
new_df=pd.concat([df[w_mask].merge(df2,left_on=['F1','F2'],right_on=['F1','F2']),
                  df[~w_mask].merge(df2.rename(columns={'F1':'F2','F2':'F1'}),
                   left_on=['F1','F2'],
                   right_on=['F1','F2'])

          ]).sort_values('index').set_index('index')

print(new_df)

輸出

       W     F1     F2  BO_F1  BO_F2
index                               
0      0  AB CD  RS TU   -400    350
1      0  BC EF  GH IJ    600   -700
2      1  BC EF  NO PQ   -500    250
3      0  GH IJ  AB CD   -150    500
4      1  KL MN  RS TU   -600    700
5      0  NO PQ  UV WX    350   -900

示例數據幀:

    print(df1)
   W     F1     F2
0  0  AB CD  RS TU
1  0  BC EF  GH IJ
2  1  BC EF  NO PQ
3  0  GH IJ  AB CD
4  1  KL MN  RS TU
5  0  NO PQ  UV WX

print(df2)
      F1     F2  BO_F1  BO_F2
0  AB CD  GH IJ   -150    500
1  BC EF  TG IP    265   -150
2  BC EF  NO PQ   -500    250
3  BC EF  GH IJ    600   -700
4  KL MN  PP UY    150   -600
5  RS TU  AB CD   -400    350
6  KL MN  RS TU   -600    700
7  UV WX  NO PQ    350   -900
8  GH IJ  BC EF    600   -700

如果df1 F1F2中存在不使用df2索引的行,並且您不想丟失它們,請使用DataFrame.merge方法中的how = 'left' ,或者如果 df2 中存在的行,則使用how = 'outer'不在df1中也是。

pd.concat([df[w_mask].merge(df2,left_on=['F1','F2'],right_on=['F1','F2'],how='left'),
           df[~w_mask].merge(df2.rename(columns={'F1':'F2','F2':'F1'}),
                   left_on=['F1','F2'],
                   right_on=['F1','F2'],
                   how='left')

          ]).sort_values('index').set_index('index')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM