使用数字列标题切割Pandas数据帧时的奇怪行为

时间:2017-03-28 00:40:17

标签: python python-3.x pandas dataframe crosstab

我有一个包含病例对照数据的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中)重复该过程会产生正确的预期结果。)

0 个答案:

没有答案