[英]Apply function to each row in Pandas dataframe by group
我構建了一個由基因名稱索引的Pandas
數據框(下面的示例),它具有列和整數的樣本名稱作為單元格值。 我想要做的是運行方差分析( f_oneway()
,來自scipy.stats
)用於由與樣本組對應的列列表定義的行值列表。 然后將這些結果存儲在一個新的Pandas
數據框中,組名作為列,索引的基因相同。
數據幀的一個例子(它是從 my 中的另一個函數返回的):
import pandas as pd
counts = {'sample1' : [0, 1, 5, 0, 10],
'sample2' : [2, 0, 10, 0, 0],
'sample3' : [0, 0, 0, 1, 0],
'sample4' : [10, 0, 1, 4, 0]}
data = pd.DataFrame(counts, columns = ['sample1', 'sample2', 'sample3', 'sample4'],
index = ['gene1', 'gene2', 'gene3', 'gene4', 'gene5'])
組由main()
作為參數導入,所以在這個函數中我有:
def compare(out_prefix, pops, data):
import scipy.stats as stats
sig = pd.DataFrame(index=data.index)
#groups will look like:
#groups = [['sample1', 'sample2'],['sample3', 'sample4']]
for group in groups:
with open(group) as infile:
groups_s = []
for spl in infile:
group_s.append(spl.replace("\n",""))
mean_col = pop.split(".")[0]+"_mean"
std_col = pop.split(".")[0]+"_std"
stat_col = pop.split(".")[0]+"_stat"
p_col = pop.split(".")[0]+"_sig"
sig[mean_col] = data[group_s].mean(axis=1)
sig[std_col] = data[group_s].std(axis=1)
sig[[stat_col, p_col]] = data.apply(lambda row : stats.f_oneway(data.loc[group_s].values.tolist()))
最后一行不起作用,我無法通過最近幾天的谷歌搜索來了解它是如何完成的 - 有人可以指出我正確的方向嗎? 理想情況下,它會將每組樣本的每行 ANOVA 測試結果(功效、顯着性) p_col
sig
stat_col
和p_col
列。 對於gene1,它將為stats.f_oneway 提供每組樣本的值列表列表,例如[[0,2],[0, 10]]
。
提前致謝!
嘗試這個:
group = ['sample1', 'sample2']
在您的樣品上:
data[group].T
看起來喜歡:
gene1 gene2 gene3 gene4 gene5
sample1 0 1 5 0 10
sample2 2 0 10 0 0
最后:
anova = stats.f_oneway(*data[group].T.values)
print(anova.statistic, anova.pvalue)
anova
對象包含您期望的內容:
0.0853333333333 0.777628169862
由於您提到您希望將結果存儲在數據框中:
def compare(data, list_of_samples):
for group in list_of_samples:
df = data[group].T
anova = stats.f_oneway(*df.values)
yield {"samples": group, "pval": anova.pvalue, "statistic": anova.statistic}
groups = [["sample1", "sample2"],["sample3", "sample4"]]
result = pd.DataFrame(compare(data, groups))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.