簡體   English   中英

按組將函數應用於 Pandas 數據框中的每一行

[英]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_colp_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM