Python中多列成对频率表

2024-06-02 04:47:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个患者诊断代码表,其中每行代表一个患者的所有诊断:

      D0             D1        D2       D3       D4        D5       D6  
0          0              0         0        0        0         0        0   
1     I48.91          R60.9    M19.90    Z87.2        0         0        0   
2        496         564.00     477.9        0    J44.9     J30.9      I10   
3        I96          R63.0     Z51.5        0  L97.909    I69.90   F01.50   
4     491.21          428.0    427.31   V58.61        0    I48.91   Z79.01   
5          0              0         0        0        0         0        0   
6      J44.9          F41.9       I10   H61.22        0       Z23        0   
7          0              0         0        0        0         0        0   
8     M48.00          I12.9     N18.9   K59.00        0     N39.0      Z23   
9      I11.9         R41.82     R56.9   E11.49   K59.00         0  J45.901   
10     I11.9          N40.0    F01.50        0    N40.1     J18.9    J44.1   
11     R31.9         M19.90         0   R53.81        0         0        0   
12         0              0         0        0        0         0        0   
13    M48.02         M48.06     I27.2        0   R53.81         0        0   
14     I50.9         M19.90     F41.9   I25.10        0         0        0   
15         0              0         0        0        0         0        0   
16   I69.359         I48.91     R74.8      I10        0  T50.901A    I95.9   

。。。600多个病人,每一个都有多达15个诊断。(0表示没有诊断)。 我想创建一个成对频率表来计算患者有不同诊断对的次数:

^{pr2}$

我创建了这样的表:

FreqTable = pd.DataFrame(columns=UniqueCodes['DCODE'], index=UniqueCodes['DCODE'])
FreqTable = FreqTable.fillna(0)

Table of Pairwise frequency counts in Python使用嵌套for循环对一列数据执行此操作,但对于多个列,这会变得复杂。有人用Python的好方法来做这件事吗?在


Tags: 代码患者代表d2d1d3d0d6
1条回答
网友
1楼 · 发布于 2024-06-02 04:47:22

让我们创建一个较小的示例,以便于查看每个步骤的效果并验证结果的正确性:

df = pd.DataFrame({'D0': ['0', 'A', 'B', 'C'],
                   'D1': ['B', '0', 'C', 'D'],
                   'D2': ['C','D','0','A']})
#   D0 D1 D2
# 0  0  B  C
# 1  A  0  D
# 2  B  C  0
# 3  C  D  A

由于0将被忽略,我们将它们改为nan:

^{pr2}$

列标签D0D1D2也是可忽略的。重要的是争吵。 让我们^{}列组成一个系列:

code = df.stack()
0  D1    B
   D2    C
1  D0    A
   D2    D
2  D0    B
   D1    C
3  D0    C
   D1    D
   D2    A
dtype: object

同样,由于列标签无关紧要,让我们去掉索引的第二级:

code.index = code.index.droplevel(1)
code.name = 'code'

所以我们最终

0    B
0    C
1    A
1    D
2    B
2    C
3    C
3    D
3    A
Name: code, dtype: object

注意,这个系列的索引引用df中的原始行标签。如果我们将^{}code与它本身,那么我们将得到同一行中每一行的所有代码对的列表:

code = code.to_frame()
pair = code.join(code, rsuffix='_2')
    #   code code_2
# 0    B      B
# 0    B      C
# 0    C      B
# 0    C      C
# 1    A      A
# 1    A      D
# 1    D      A
# 1    D      D
# 2    B      B
# 2    B      C
# 2    C      B
# 2    C      C
# 3    C      C
# 3    C      D
# 3    C      A
# 3    D      C
# 3    D      D
# 3    D      A
# 3    A      C
# 3    A      D
# 3    A      A

现在,通过使用^{}根据此数据制作频率表来解决问题:

freq = pd.crosstab(pair['code'], pair['code_2'])

综合起来:

import numpy as np
import pandas as pd
df = pd.DataFrame({'D0': ['0', 'A', 'B', 'C'],
                   'D1': ['B', '0', 'C', 'D'],
                   'D2': ['C','D','0','A']})
#   D0 D1 D2
# 0  0  B  C
# 1  A  0  D
# 2  B  C  0
# 3  C  D  A

df = df.replace('0', np.nan)
code = df.stack()
code.index = code.index.droplevel(1)
code.name = 'code'
code = code.to_frame()
pair = code.join(code, rsuffix='_2')
freq = pd.crosstab(pair['code'], pair['code_2'])

收益率

code_2  A  B  C  D
code              
A       2  0  1  2
B       0  2  2  0
C       1  2  3  1
D       2  0  1  2

相关问题 更多 >