Python 按两列中的值对数据帧进行排序

Python 按两列中的值对数据帧进行排序,python,pandas,dataframe,concat,Python,Pandas,Dataframe,Concat,我尝试使用数据框中两列中的值创建数据框,它们的外观如下: df1 df2 我想要的是: 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

我尝试使用数据框中两列中的值创建数据框,它们的外观如下:

df1

df2

我想要的是:

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
我想根据列
F1
F2
的值,将列
BO_F1
BO_F2
从df2合并到df1。我遇到的主要问题是,例如,一些值的组合被交换 在df1中,
F1
F2
中的第一个组合是
AB CD
RS TU
,但df2中的这些值是交换的,这就是,
F1
F2
RS TU
AB CD

如何实现这一点?

df1.set\u index('F1')。join(df2.set\u 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
的每个值,可以单独使用:

输出

       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
F1
F2
中有行未使用
df2
进行索引,并且您不想丢失它们,则在方法中使用
how='left'
,或者如果df2中存在的行不在
df1
中,则使用
how='outer'

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')

你应该用最少的工作实例来澄清你的问题。简化您的问题并编写一些代码来定义一些复制您的问题的数据帧。这将使帮助更容易请告诉我我的解决方案是否有效
       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
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')