У меня есть серия, которую я разделил на две части, поскольку части содержат термины, которые нужно обрабатывать по-разному. Впоследствии я хочу объединить две разделенные серии (на самом деле, после обработки они теперь являются двухколоновыми файловыми кадрами) в том порядке, в котором они были первоначально. Я почти решил ее:Объединить столбцы из двух данных в один
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
Выше я хочу объединить столбец аннотаций в единое целое. Они должны быть взаимоисключающими (nans in one имеет значение в другом).
Вот что я пробовал:
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
Я включил всю эту длинную вещь, потому что я изначально хотел сделать, это, вероятно, можно сделать в несколько строк. Поэтому я вместо того, чтобы просто показать свою последнюю проблему, я включил в нее все, потому что с последней проблемой, с которой я сейчас борюсь, можно было бы избежать, если бы я был умнее.
Использование панд, если то, что вы пытаетесь достичь, кажется сложным, возможно, это :) – Gecko