pingouin.pairwise_ttests(dv=None, between=None, within=None, subject=None, data=None, parametric=True, alpha=0.05, tail='two-sided', padjust='none', effsize='hedges', return_desc=False, export_filename=None)[source]

Pairwise T-tests.

dv : string

Name of column containing the dependant variable.

between : string or list with 2 elements

Name of column(s) containing the between factor(s).

within : string or list with 2 elements

Name of column(s) containing the within factor(s).

subject : string

Name of column containing the subject identifier. Compulsory for contrast including a within-subject factor.

data : pandas DataFrame


parametric : boolean

If True (default), use the parametric ttest() function. If False, use pingouin.wilcoxon() or pingouin.mwu() for paired or unpaired samples, respectively.

alpha : float

Significance level

tail : string

Indicates whether to return the ‘two-sided’ or ‘one-sided’ p-values

padjust : string

Method used for testing and adjustment of pvalues. Available methods are

'none' : no correction
'bonferroni' : one-step Bonferroni correction
'holm' : step-down method using Bonferroni adjustments
'fdr_bh' : Benjamini/Hochberg FDR correction
'fdr_by' : Benjamini/Yekutieli FDR correction
effsize : string or None

Effect size type. Available methods are

'none' : no effect size
'cohen' : Unbiased Cohen d
'hedges' : Hedges g
'glass': Glass delta
'eta-square' : Eta-square
'odds-ratio' : Odds ratio
'AUC' : Area Under the Curve
return_desc : boolean

If True, append group means and std to the output dataframe

export_filename : string

Filename (without extension) for the output file. If None, do not export the table. By default, the file will be created in the current python console directory. To change that, specify the filename with full path.

stats : DataFrame

Stats summary

'A' : Name of first measurement
'B' : Name of second measurement
'Paired' : indicates whether the two measurements are paired or not
'Parametric' : indicates if (non)-parametric tests were used
'Tail' : indicate whether the p-values are one-sided or two-sided
'T' : T-values (only if parametric=True)
'U' : Mann-Whitney U value (only if parametric=False and unpaired data)
'W' : Wilcoxon W value (only if parametric=False and paired data)
'p-unc' : Uncorrected p-values
'p-corr' : Corrected p-values
'p-adjust' : p-values correction method
'BF10' : Bayes Factor
'hedges' : Hedges effect size
'CLES' : Common language effect size

See also

Non-parametric test for paired samples.
Non-parametric test for independent samples.


If between or within is a list (e.g. [‘col1’, ‘col2’]), the function returns 1) the pairwise T-tests between each values of the first column, 2) the pairwise T-tests between each values of the second column and 3) the interaction between col1 and col2. The interaction is dependent of the order of the list, so [‘col1’, ‘col2’] will not yield the same results as [‘col2’, ‘col1’].

In other words, if between is a list with two elements, the output model is between1 + between2 + between1 * between2.

Similarly, if within` is a list with two elements, the output model is within1 + within2 + within1 * within2.

If both between and within are specified, the function return within + between + within * between.


  1. One between-factor
>>> from pingouin import pairwise_ttests, read_dataset
>>> df = read_dataset('mixed_anova.csv')
>>> post_hocs = pairwise_ttests(dv='Scores', between='Group', data=df)
  1. One within-factor
>>> post_hocs = pairwise_ttests(dv='Scores', within='Time',
...                             subject='Subject', data=df)
>>> print(post_hocs)
  1. Non-parametric pairwise paired test (wilcoxon)
>>> pairwise_ttests(dv='Scores', within='Time', subject='Subject',
...                 data=df, parametric=False)
  1. Within + Between + Within * Between with corrected p-values
>>> pairwise_ttests(dv='Scores', within='Time', subject='Subject',
...                 between='Group', padjust='bonf', data=df)
  1. Between1 + Between2 + Between1 * Between2
>>> pairwise_ttests(dv='Scores', between=['Group', 'Time'], data=df)