如何在熊猫中串联2个数据帧的匹配?

时间:2019-06-17 12:14:32

标签: python-3.x pandas dataframe

我有两个数据框。我想在列标题(df2)中找到行(df1)的匹配项

           df1
index
  1        Reactor1  
  1        FIC-2005

  2       Reactor2
  2       FIC-2007

  .       ...


        df2
index
  0        FIC-2005    FIC-2007   .....
  1       0.005       0.006
  2       0.05        0.06

输出到df3

df3

index      Reactor1        Reactor2     ....
 0
 1         FIC-2005        FIC-2007
 2         FIC-2005        FIC-2007
 3         0.005           0.006
 4         0.05            0.06

有人有主意吗?

1 个答案:

答案 0 :(得分:0)

我创建了第一个测试数据框,如下所示:

df1 = pd.DataFrame(data=[
    [ 1, 'Reactor2' ],
    [ 1, 'FIC-2007' ],
    [ 2, 'Reactor1' ],
    [ 2, 'FIC-2005' ]],
    columns=['index', 'text']).set_index('index')

所以我添加了一个列名( text ),您错过了该列名(每个列必须有一个名称)。

要创建第二个测试数据帧,我运行:

df2 = pd.DataFrame(data=[
    [ 'FIC-2005', 'FIC-2007' ],
    [ 0.005, 0.006 ],
    [ 0.05, 0.06 ]]

所以我接受了默认的列名(连续数字)和默认的索引 (也是连续数字)。

df1 中可以看到,每对具有相同 index 的行包含:

  • 反应器名称-要在 df2 中设置的列名称,
  • 反应器ID - df2 顶行中的值。

为确保熊猫做出正确的订购,我特意推翻了 df1 中组的顺序。

第一步是创建“字典表”:

df1a = pd.DataFrame(df1.groupby(level=0).text.agg(list).to_list(),
    columns=['Reac', 'FIC']).set_index('FIC')

其中索引为反应堆ID FIC ),值为反应堆名称

结果是:

              Reac
FIC               
FIC-2007  Reactor2
FIC-2005  Reactor1

然后我阅读 df2 的第一行-包含 FID s的行:

rFIC = df2.iloc[0]

其余步骤为:

  • rFIC 重新索引 df1a ,以根据 df2
  • 顶行中的名称
  • 从中获取列0,
  • 将其转换为列表,
  • 将其设置为 df2 中的列名。

代码是:

df2.columns = df1a.reindex(rFIC).iloc[:,0].to_list()

现在,当您打印 df2 时,您将看到正确的列名:

   Reactor1  Reactor2
0  FIC-2005  FIC-2007
1     0.005     0.006
2      0.05      0.06

当然,要完成工作, df1 必须包含尽可能多的行对 作为 df2 中的列数。