2015-06-11 3 views
1

У меня есть серия, которую я разделил на две части, поскольку части содержат термины, которые нужно обрабатывать по-разному. Впоследствии я хочу объединить две разделенные серии (на самом деле, после обработки они теперь являются двухколоновыми файловыми кадрами) в том порядке, в котором они были первоначально. Я почти решил ее:Объединить столбцы из двух данных в один

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 

Я включил всю эту длинную вещь, потому что я изначально хотел сделать, это, вероятно, можно сделать в несколько строк. Поэтому я вместо того, чтобы просто показать свою последнюю проблему, я включил в нее все, потому что с последней проблемой, с которой я сейчас борюсь, можно было бы избежать, если бы я был умнее.

ответ

2

Использование 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 
+0

Использование панд, если то, что вы пытаетесь достичь, кажется сложным, возможно, это :) – Gecko

Смежные вопросы