Python 在不使用循环的情况下,使用来自单独数据帧的编码数据向数据帧添加新列?

Python 在不使用循环的情况下,使用来自单独数据帧的编码数据向数据帧添加新列?,python,dataframe,pandas,Python,Dataframe,Pandas,我的问题是,我有一个很大的数据框(~300000行),每个主题有多行,表示不同条件下的给定值。简化版本如下所示: In [12]: df1 Out[12]: SubID Condition Value 0 1 1 0.123 1 1 2 0.234 2 2 1 0.345 3 2 2 0.456 4 3 1 0.567 5 3

我的问题是,我有一个很大的数据框(~300000行),每个主题有多行,表示不同条件下的给定值。简化版本如下所示:

In [12]: df1
Out[12]:
   SubID  Condition  Value
0      1          1  0.123
1      1          2  0.234
2      2          1  0.345
3      2          2  0.456
4      3          1  0.567
5      3          2  0.678
6      4          1  0.789
In [17]: df2
Out[17]:
   Subject Number Genetic Group
0               1             A
1               2             C
2               3             A
3               4             B
我还有第二张表,只有80多行,其中包含了受试者所属的基因组

我希望将该数据添加到第一个数据帧中。编码表的简化版本如下所示:

In [12]: df1
Out[12]:
   SubID  Condition  Value
0      1          1  0.123
1      1          2  0.234
2      2          1  0.345
3      2          2  0.456
4      3          1  0.567
5      3          2  0.678
6      4          1  0.789
In [17]: df2
Out[17]:
   Subject Number Genetic Group
0               1             A
1               2             C
2               3             A
3               4             B
我想要的结果是:

In [19]: df1
Out[19]:
   SubID  Condition  Value Genetic Group
0      1          1  0.123             A
1      1          2  0.234             A
2      2          1  0.345             C
3      2          2  0.456             C
4      3          1  0.567             A
5      3          2  0.678             A
6      4          1  0.789             B

我可以使用for:循环,但想知道是否有一种方法可以使用Pandas数据帧合并或连接操作来避免这种情况?非常感谢,

您可以按子ID编制索引,然后使用
加入
获取所需内容:

df1.set_index("SubID", inplace=True)
df2.set_index("Subject Number", inplace=True)
df3 = df1.join(df2, how="left")
或者,您可以使用
merge
来完成以下操作,而无需编制索引:

df3 = df1.merge(df2, left_on="SubID", right_on="Subject Number", how="left")
另一种方式是:

In [1]: import pandas as pd

In [2]: a = pd.DataFrame({"SubID":[1,1,2,2], "Condition":[1,2,1,2], "Value":[.123,.234,.345,.456]})

In [3]: a
Out[3]: 
   Condition  SubID  Value
0          1      1  0.123
1          2      1  0.234
2          1      2  0.345
3          2      2  0.456

In [4]: a = a.set_index(["SubID","Condition"]).unstack()

In [5]: b = pd.DataFrame({"Subject Number":[1,2], "Genetic Group":['A','C']})

In [6]: b
Out[6]: 
  Genetic Group  Subject Number
0             A               1
1             C               2

In [7]: b["Condition"] = "Genetic Group"

In [8]: b = b.rename(columns={"Genetic Group":"Value"})

In [9]: b = b.set_index(["Subject Number","Condition"]).unstack()

In [10]: b
Out[10]: 
                       Value
Condition      Genetic Group
Subject Number              
1                          A
2                          C

In [11]: r = a.merge(b, left_index=True, right_index=True)

In [12]: r
Out[12]: 
           Value                Value
Condition      1      2 Genetic Group
SubID                                
1          0.123  0.234             A
2          0.345  0.456             C

In [13]: r = r.unstack()

In [14]: r = r.swaplevel(0,2).sort_index()

In [15]: r
Out[15]: 
SubID  Condition           
1      1              Value    0.123
       2              Value    0.234
       Genetic Group  Value        A
2      1              Value    0.345
       2              Value    0.456
       Genetic Group  Value        C

谢谢你,马克西姆。我今天又看了一眼你的回复(现在我又站在我的电脑前),这很有道理。我认为这可能对我以后需要做的其他操作有用,因此感谢您花时间回复。@PhilipLawrence我本应该添加更多评论,但时间不够。基本上,您的数据是狭义格式的。我首先将其转换为长格式,其中每个值类型都有自己的列,然后添加另一个包含类别的列,然后将其转换回窄格式。