2016-11-17 196 views
0

我DATAS這個樣子Python的大熊貓條件變換

Plate LogRatio 
1  0.4 
1  0.3 
1  0.2 
2  0.5 
2  0.3 

我謹板做3種數比的平均值:我不想數清我的平均極值數比(分位數排除)。

m1 = mean(LogRatio[LogRatio > q20LogRatio & LogRatio < q80LogRatio]) 
m2 = mean(LogRatio[LogRatio > q25LogRatio & LogRatio < q75LogRatio]) 
m3 = mean(LogRatio[LogRatio > q30LogRatio & LogRatio < q70LogRatio]) 
M = (m1 + m2 + m3)/3 

我想是這樣的:

df['m1'] = df.groupby('Plate')['LogRatio'].transform(lambda x: ((x > x.quantile(q=0.20)) & (x < x.quantile(q=0.80))).mean()) 
df['m2'] = df.groupby('Plate')['LogRatio'].transform(lambda x: ((x > x.quantile(q=0.25)) & (x < x.quantile(q=0.75))).mean()) 
df['m3'] = df.groupby('Plate')['LogRatio'].transform(lambda x: ((x > x.quantile(q=0.30)) & (x < x.quantile(q=0.70))).mean()) 
df['M'] = (df['m1'] + df['m2'] + df['m3'])/3 

但如果我這樣做手工了calc每個平均的結果是不一樣的。 在轉換函數中,我的邏輯條件是不是這樣理解的嗎?我知道結果是錯誤的,但在終端中沒有「錯誤」,所以我不知道該怎麼做。

+0

好像你需要'Groupby.apply'而不是'transform',因爲你正在過濾組並將該功能僅應用於那些滿足條件的許多元素。另一方面,'Transform'適用於整個系列。也許,那是造成錯誤價值的原因。 –

+0

'Groupby.apply'填充「NaN」到我的新列中。我想將這個函數應用到我所有的行上,因爲我在數據框中創建了新的列,這就是爲什麼我認爲「變換」是可以的,但是是的,你是對的,我從滿足條件的元素得到平均值,爲我的新專欄中的每一行。無論如何'申請'甚至不給我數字,只是「NaN」。 – Elysire

回答

1

AFAIU如下我想改變lambda函數:

df.groupby('Plate')['LogRatio'].transform(lambda s: s.loc[[True if v < s.quantile(q=0.8) and v > s.quantile(q=0.2) else False for v in s]].mean()) 

這在s.loc[]以子集中的LogRatio- Series

爲了使其更易於閱讀接受一個interable與布爾值,我'd尋求以下解決方案:

def quartile_subset(logratios,lower,upper): 
    # some comment to describe what you are doing 
    return logratios.loc[[True if v < logratios.quantile(q=upper) and v > logratios.quantile(q=lower) else False for v in logratios]] 

df.groupby('Plate')['LogRatio'].transform(lambda s: quartile_subset(s,0.2,0.8).mean())