2016-05-17 3 views
0

Скажем, нам дается двухфакторная (M) конструкция ANOVA, т. Е. Конструкция выборки состоит из двух категориальных переменных с двумя и тремя уровнями соответственно и откликом измерения 4. Предположим также, что данные приведены в широкий формат были первыми двумя переменными, описывающими дизайн и последние четыре переменные. (Итак, суть в том, что переменные проектирования уже в длинном формате, но переменные ответа не являются.)Как расплавить/сфотографировать двухфакторный многомерный DataFrame из широкого формата в длинный?

Как расплавить данные в длинный формат?

Раствор в R:

# Data managment 
library(reshape2) 

# Creating sample data 
set.seed(12345) 
dat = data.frame(matrix(rnorm(42*4, mean=c(10,3,5,1)), ncol=4, byrow=T)) 
names(dat) = c('Base', 'State23', 'State42', 'End') 
gen = factor(sample(2, size=42, replace=T), labels=c('WT', 'HET')) 
env = factor(sample(3, size=42, replace=T), labels=c('heavySmoker', 'casualSmoker', 'nonSmoker')) 
dat$genotype = gen 
dat$environment = env 

# Melting 
melt(dat, measure.vars=c('Base', 'State23', 'State42', 'End')) 

Проблема в питоне:

# Numerics 
import numpy as np 
from numpy.random import randint 

# Data managment 
import pandas as pd 
from pandas import DataFrame 
from pandas import Series 

# Creating sample data 
np.random.seed(12345) 
index = pd.Index(np.arange(42)) 
frame = DataFrame(np.random.randn(42,4) + np.array([10,3,5,1]), columns=['Base', 'State23', 'State42', 'End'], index=index) 
genotype = Series(['WT', 'HET'], name='genotype', dtype='category') 
environment = Series(['heavySmoker', 'casualSmoker', 'nonSmoker'], name='environment', dtype='category') 
gen = genotype[np.random.randint(2, size=42)] 
env = environment[np.random.randint(3, size=42)] 
gen.index = frame.index 
env.index = frame.index 
frame['genotype'] = gen 
frame['environment'] = env 

# How to melt? 
frame.stack() # How to stack only the four response variables? 

Я знаю, или по крайней мере, предположить, что я должен использовать функции frame.stack() и рамка .unstack() в некотором роде, но, к сожалению, это очень неудачно.

+0

Как добавить строки в DataFrame? – reptilicus

ответ

2

Вы можете использовать панда melt функцию:

In [139]: pd.melt(frame, id_vars=['genotype', 'environment'], value_vars=['Base', 'State23', 'State42', 'End']) 
Out[139]: 
    genotype environment variable  value 
0  HET  nonSmoker  Base 9.795292 
1   WT heavySmoker  Base 11.965781 
2  HET heavySmoker  Base 10.769023 
3  HET casualSmoker  Base 10.274992 
4  HET heavySmoker  Base 7.998363 
5   WT casualSmoker  Base 9.460259 
6   WT heavySmoker  Base 9.422913 
7  HET  nonSmoker  Base 10.000940 
... 

Для использования (бит более низкого уровня) stack метода, сначала нужно установить индекс (и будут переименовать столбцы позже):

In [136]: frame.set_index(['genotype', 'environment']).stack().reset_index() 
Out[136]: 
    genotype environment level_2   0 
0  HET  nonSmoker  Base 9.795292 
1  HET  nonSmoker State23 3.478943 
2  HET  nonSmoker State42 4.480561 
3  HET  nonSmoker  End 0.444270 
4   WT heavySmoker  Base 11.965781 
... 
Смежные вопросы