我有一个包含病例对照数据的Pandas数据框,可以用以下结构表示:
caseA caseN catA
0 y 1 a
1 y 1 a
2 y 1 b
3 y 1 b
4 y 1 c
5 y 1 d
6 y 1 a
7 y 1 c
8 n 0 c
9 n 0 d
10 n 0 a
11 n 0 b
12 n 0 c
13 n 0 a
14 n 0 d
15 n 0 a
16 n 0 b
17 n 0 c
18 n 0 a
19 n 0 d
caseA和caseN变量分别将case和控件表示为字符串和整数。
我可以计算2x2表,以便使用pandas交叉表方法计算赔率和比值比。列的默认顺序是控制大小写,但我将其更改为大小写控制,根据我的想法,这更加直观。
然后我对数据帧进行切片,只打印一个选定行数的行,其中包含了案例中的列 - 控制。这完全符合预期。
但是,如果我向数据框添加一个新列(例如包含odds值的列),然后以完全相同的方式对数据框进行切片,则会以错误的顺序打印个案和控件。
以下代码段说明了这一点:
df = pd.DataFrame({'caseN':[1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0],
'caseA':['y','y','y','y','y','y','y','y','n','n','n','n','n','n','n','n','n','n','n','n'],
'catA':['a','a','b','b','c','d','a','c','c','d','a','b','c','a','d','a','b','c','a','d']})
print('\nCross tabulation\n')
continTab = pd.crosstab(df['catA'],df['caseN'])
print(continTab)
print('\nReorderd cross tabulation\n')
continTab = continTab[[1,0]]
print(continTab)
#print('\n<-- An extra column containg odds has been entered here -->')
#continTab['odds'] = continTab[1]/continTab[0]
print('\nPrint just a slice contains rows a and c only with 1 - 0 column order\n')
print(continTab.loc[['a','c'],[1,0]])
在第一次生成切片表时,正如预期的那样:
caseN 1 0
catA
a 3 4
c 2 3
但是,如果您取消注释计算赔率列的代码,然后重新运行完全相同的代码,则生成的切片表是:
caseN 0 1
catA
a 4 3
c 3 2
我认为没有理由这样做。这是一个错误吗?
(有趣的是,使用描述为字符串的案例控制数据(在变量caseA中)重复该过程会产生正确的预期结果。)