2013-03-05 1 views
2

Проблема заключается в том, что у меня есть большой фреймворк (~ 300 000 строк) с несколькими строками для каждого объекта, представляющего заданное значение в разных условиях. Упрощенный вариант показан ниже:Добавить новый столбец в Pandas DataFrame с данными кодирования из отдельного DataFrame без использования Loop?

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 

Я мог бы использовать для: петли, но задавался вопросом, как метод с использованием любого от слияния или присоединения Pandas DataFrame, которые могли бы избежать этого? Большое спасибо,

ответ

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

Другой способ :

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 
+0

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

+0

@PhilipLawrence Мне следовало добавить дополнительные комментарии, но не хватило времени. В основном ваши данные находятся в формате _narrow_. Сначала я конвертирую его в формат _long_, где каждый тип значения имеет свой собственный столбец, затем добавляет еще один столбец с категориями и затем преобразует его обратно в формат _narrow_. –

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