【问题标题】:Run T test on merged values in rows of pandas dataframe对 pandas 数据框行中的合并值运行 T 检验
【发布时间】:2020-07-25 15:40:20
【问题描述】:

我想在我的数据框中获取两列合并值,并对 x_和 y_merged_psi_values 之间的每一行运行 t 检验。然后我想将 t 和 p 值附加到原始 df 的末尾。我的实际起始数据框要大得多,但这是布局示例:

In [3]: df=pd.DataFrame({'chromosome':[1,1,5], 
   ...:                  'strand':['-','-','+'], 
   ...:                  'elementloc':[4991, 8870, 2703], 
   ...:                  'x_Merged_Psi_values': ['0.21, 0.25,0.63,0.92','0.3, 0.
   ...:6, 0.78, 0.9', '0.39, 0.11, 0.09, 0.94'], 
   ...:                  'y_Merged_Psi_values':['0.11, 0.45, nan', '0.45, 0.22, 
   ...: 0.89', '0.17, 0.12, 0.64']}) 
   ...: df         

                                                         

Out[3]: 
   chromosome strand  elementloc     x_Merged_Psi_values y_Merged_Psi_values
0           1      -        4991    0.21, 0.25,0.63,0.92     0.11, 0.45, nan
1           1      -        8870    0.3, 0.56, 0.78, 0.9    0.45, 0.22, 0.89
2           5      +        2703  0.39, 0.11, 0.09, 0.94    0.17, 0.12, 0.64

我知道如何为一行执行此操作,但需要帮助通过其余行自动执行此操作,尤其是因为我知道不建议遍历 pandas 数据帧行。

这是我为一排做的事情。我想对所有行执行此操作,并将生成的 t 和 p 值附加到 df。

X_psi=df["x_Merged_Psi_values"].to_list()
X_psi = [i.split(',') for i in X_psi]
X_psi = [ x for x in X_psi[0] if str(x) != 'nan']
X_psi = [float(i) for i in X_psi]
X_psi

Y_psi=df["y_Merged_Psi_values"].to_list()
Y_psi = [i.split(',') for i in Y_psi]
Y_psi = [ x for x in Y_psi[0] if str(x) != 'nan']
Y_psi = [float(i) for i in Y_psi]
Y_psi

t, p = ttest_ind(X_psi, Y_psi, equal_var=False)
print("Ttest_ind:      t=%g  p=%g" %(t,p))

【问题讨论】:

    标签: python pandas dataframe scipy


    【解决方案1】:

    我认为不循环就无法逃脱,因为每一行都需要单独的 T 检验。只是对相同代码的建议:

    X_psi = [[float(x) for x in row.split(',') if x!='nan'] for row in df.x_Merged_Psi_values]
    Y_psi = [[float(x) for x in row.split(',') if x!='nan'] for row in df.y_Merged_Psi_values]
    t_list, p_list = [], []
    for X, Y in zip(X_psi, Y_psi):
        t, p = ttest_ind(X, X, equal_var=False)
        #print("Ttest_ind:      t=%g  p=%g" %(t,p))
        t_list.append(t)
        p_list.append(p_list)
    df = df.assign(t_values=t_list, p_values=p_list)
    

    另外,看看Series.str.split()。如果所有行在拆分后具有大致相同数量的项目,则可以更容易:

    df.x_Merged_Psi_values = df.x_Merged.Psi_values.str.split(pat=',')
    df.y_Merged_Psi_values = df.y_Merged_Psi_values.str.split(pat=',')
    for X, Y in zip(df.x_Merged_Psi_values, df.y_Merged_Psi_values):
        t, p = ttest_ind(map(float, X), map(float, Y), equal_var=False)
        # and the rest of the code
    

    【讨论】:

    • 感谢您的回答!我在第一部分遇到问题:取消合并/拆分每一行字符串。您的建议将所有行连接在一起,这使我无法准确运行 t 检验。有没有办法将每一行分成自己的列表?
    • 我的错误,刚刚编辑了列表理解...现在试试吧
    猜你喜欢
    • 2015-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多