Мне очень известна эта ссылка:
Есть ли в Pandas питонный способ составить таблицу непредвиденных обстоятельств?
Там, где два столбца преобразуются в непредвиденный случай 2x2, а затем точный тест Фишера можно легко выполнить. С чем я борюсь, так это как я могу взять вышеупомянутое решение и применить его к нескольким столбцам. Мои данные выглядят так:
Samples A B C D E F G H I J K L M N 0 P
AA1 1 1 0 0 1 0 0 0 1 1 0 0 1 0 0 0
AA2 1 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0
AA3 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0
AA4 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0
AA5 0 0 0 1 0 1 0 0 0 0 0 1 0 1 0 0
AA6 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0
AA7 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
AA8 1 0 0 0 1 1 0 0 1 0 0 0 1 1 0 0
AA9 0 0 0 0 1 0 0 1 0 0 0 0 1 0 0 1
AA10 1 1 1 0 1 0 0 1 1 1 1 0 1 0 0 1
AA11 1 0 1 1 0 1 0 1 1 0 1 1 0 1 0 1
AA12 1 0 1 0 0 0 1 1 1 0 1 0 0 0 1 1
AA13 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 1
AA14 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1
AA15 1 0 0 1 0 0 1 1 1 0 0 1 0 0 1 1
AA16 0 0 0 0 1 0 1 1 0 0 0 0 1 0 1 1
AA17 1 0 0 0 0 0 1 1 1 0 0 0 0 0 1 1
AA18 1 1 1 0 0 0 0 1 1 1 1 0 0 0 0 1
AA19 1 0 0 1 1 1 0 1 1 0 0 1 1 1 0 1
AA20 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
AA21 1 1 1 0 0 1 1 1 1 1 1 0 0 1 1 1
AA22 0 0 0 1 0 0 1 1 0 0 0 1 0 0 1 1
AA23 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1
и я хотел бы получить вывод, подобный следующему (обратите внимание, что приведенные ниже значения являются поддельными, а donot представляют вышеуказанные данные):
A B C D E F G H I J K L M N O P
A
B 0.05
C 0.9 0.9
D 0.4 0.8 0.8
E 0.002 0.001 0.8 0.02
F 0.12 0.67 0.001 0.8 0.6
G 0.9 0.9 0.8 0.01 0.8 0.8
H 0.1 0.22 0.8 0.8 0.8 0.33 0.01
I 0.05 0.05 0.05 0.05 0.05 0.05 0.05 0.05
J 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9
K 0.4 0.4 0.4 0.4 0.4 0.4 0.4 0.8 0.9 0.9
L 0.02 0.02 0.02 0.02 0.02 0.02 0.02 0.02 0.8 0.02 0.02
M 0.12 0.12 0.12 0.12 0.12 0.12 0.12 0.67 0.001 0.8 0.6 0.8
N 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.9 0.8 0.01 0.8 0.8 0.8
O 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.22 0.8 0.8 0.8 0.33 0.01 0.01
P 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.22 0.8 0.8 0.8 0.33 0.01 0.01 0.01
Код на данный момент:
import pandas as pd
from scipy.stats import fisher_exact
df = pd.read_table("......")
df.set_index("Samples", inplace=True)
print(df.head())
print(pd.crosstab(df.A, df.B))
tab = pd.crosstab(df.A, df.B)
print(fisher_exact(tab))
Это дает мне 2x2 и p-val, но я не знаю, как перебирать столбцы. Как A против B, A против C, A против D ... и т. Д. ... и т. Д. И поместите p-значения в выходной формат.
Любое руководство высоко ценится!