Python 在不使用循环的情况下,使用来自单独数据帧的编码数据向数据帧添加新列?
我的问题是,我有一个很大的数据框(~300000行),每个主题有多行,表示不同条件下的给定值。简化版本如下所示: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
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我本应该添加更多评论,但时间不够。基本上,您的数据是狭义格式的。我首先将其转换为长格式,其中每个值类型都有自己的列,然后添加另一个包含类别的列,然后将其转换回窄格式。