Pandas concat数据帧的两列中的值

问题描述 投票:1回答:3

我正在尝试使用数据帧中两列中的值创建数据帧,这就是它们的外观:

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

我想根据列BO_F1BO_F2的值将df2的F1F2合并到df1。我遇到的主要问题是交换了一些值组合,例如在df1中,F1F2中的第一个组合为AB CDRS TU,但df2中的此类值被交换,即F1F2RS TUAB CD

我该如何实现?

python pandas dataframe concat
3个回答
0
投票

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

这项工作吗?我不确定我是否正确理解问题


0
投票

[我想,如果我理解正确,那么您只是关心基于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')

0
投票

您可以使用DataFrame.merge对于DataFrame.merge的每个值,您可以分别使用W

pd.concat

输出

pd.concat

Sample DataFrame:

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 F1中存在不以F2进行索引的行,并且您不想丢失它们,请在df1方法中使用df2,或者在how = 'left'中使用出现在df2中但不在DataFrame.merge中的行也是。

DataFrame.merge
© www.soinside.com 2019 - 2024. All rights reserved.