我遇到的问题是我有一个大型数据帧(~300,000行),每个主题有多行代表不同条件下的给定值。简化版如下所示:
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
我还有第二张表,其中只有80多行,其中包含受试者所属的遗传组。
我希望将该数据添加到第一个DataFrame中。编码表的简化版如下所示:
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:loop但是想知道是否有一个方法使用任何Pandas DataFrame合并或加入操作来避免这种情况?非常感谢,
答案 0 :(得分:2)
您可以按SubID编制索引,然后使用join
获取所需内容:
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")
答案 1 :(得分:1)
另一种方式是:
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