Python 将两个数据帧中的列合并为一个

Python 将两个数据帧中的列合并为一个,python,pandas,Python,Pandas,我有一个系列,我分为两部分,因为部分包含需要以不同方式处理的术语。之后,我想按照最初的顺序合并两个拆分序列(实际上,在处理之后,它们现在是两列数据帧)。我几乎解决了这个问题: import pandas as pd terms = pd.Series(["oo1", "oo2", "oo3", "aa1", "aa2", "oo4"], name="term") # 0 oo1 # 1 oo2 # 2 oo3 # 3 aa1 # 4 aa2 # 5 oo4

我有一个系列,我分为两部分,因为部分包含需要以不同方式处理的术语。之后,我想按照最初的顺序合并两个拆分序列(实际上,在处理之后,它们现在是两列数据帧)。我几乎解决了这个问题:

import pandas as pd
terms = pd.Series(["oo1", "oo2", "oo3", "aa1", "aa2", "oo4"], name="term")

# 0    oo1
# 1    oo2
# 2    oo3
# 3    aa1
# 4    aa2
# 5    oo4
terms_oo = terms[terms.apply(lambda term: "oo" in term)]

# 0    oo1
# 1    oo2
# 2    oo3
# 5    oo4
terms_aa = terms[terms.apply(lambda term: "aa" in term)]

# 3    aa1
# 4    aa2

# process differently so you end up with
df_aa = pd.concat([terms_aa, pd.Series(["taa1", "taa2"], index=[3, 4])], axis=1)
df_aa.columns = ["term", "annotations"]

#    term annotations
# 3  aa1  taa1
# 4  aa2  taa2

df_oo = pd.concat([terms_oo, pd.Series(["too1", "too2", "too3", "too4"], index=[0, 1, 2, 5])], axis=1)
df_oo.columns = ["term", "annotations"]

#   term annotations
# 0  oo1  too1
# 1  oo2  too2
# 2  oo3  too3
# 5  oo4  too4
现在我想组合
df_aa
df_oo
,使它们具有
terms
中的原始顺序,并且
annotations
是一列,包括
df_aa
df_oo
中的值。我该怎么做

我尝试了以下步骤,但找不到所需的最后一步:

terms_df = pd.DataFrame(terms)
m1 = terms_df.merge(df_aa, on="term", how="outer")
m2 = m1.merge(df_oo, on="term", how="outer")

#  term annotations_x annotations_y
# 0  oo1           NaN          too1
# 1  oo2           NaN          too2
# 2  oo3           NaN          too3
# 3  aa1          taa1           NaN
# 4  aa2          taa2           NaN
# 5  oo4           NaN          too4
在上面,我想将annotations列合并为一个。它们应该是相互排斥的(一个中的NAN在另一个中有一个值)

以下是我尝试过的:

m2["annotations"] = m2[pd.isnull(m2["annotations_x"])]["annotations_y"]

m2
#   term annotations_x annotations_y annotations
# 0  oo1           NaN          too1        too1
# 1  oo2           NaN          too2        too2
# 2  oo3           NaN          too3        too3
# 3  aa1          taa1           NaN         NaN
# 4  aa2          taa2           NaN         NaN
# 5  oo4           NaN          too4        too4

m2["annotations"] = m2[pd.isnull(m2["annotations_y"])]["annotations_x"]
m2
#  term annotations_x annotations_y annotations
# 0  oo1           NaN          too1         NaN
# 1  oo2           NaN          too2         NaN
# 2  oo3           NaN          too3         NaN
# 3  aa1          taa1           NaN        taa1
# 4  aa2          taa2           NaN        taa2
# 5  oo4           NaN          too4         NaN
我包括了这整件很长的事情,因为我最初想做的事情可能只需要几行就可以完成。因此,我没有仅仅展示我的最后一个问题,而是将整个问题都包括在内,因为如果我更聪明的话,我现在正在努力解决的最后一个问题可能是可以避免的。

使用
append()
sort()
这里没有必要做任何复杂的事情。索引被保留,因此您可以简单地附加它们并对它们进行排序

result = df_oo.append(df_aa).sort()
print(result)

  term annotations
0  oo1        too1
1  oo2        too2
2  oo3        too3
3  aa1        taa1
4  aa2        taa2
5  oo4        too4

使用熊猫,如果你想要实现的感觉很复杂,可能是:)