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