在不使用循环的情况下,将编码数据从一个DataFrame添加到Pandas DataFrame的新列中?
我遇到的问题是,我有一个很大的数据表(大约有30万行),每个主题有多行数据,表示在不同条件下的值。下面是一个简化的版本:
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行,里面存储了每个主题所属的基因组信息。
我想把这个数据添加到第一个数据表中。下面是这个编码表的简化版本:
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的数据表合并或连接操作来避免这样做?非常感谢,
2 个回答
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
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")