在python中创建一个混淆矩阵

时间:2017-08-19 11:10:12

标签: python pandas

我遇到了在python中创建混淆矩阵的问题。我目前有以下csv文件,其中一个表组织在两列中,如下所示:

----------
Letter | Code

A   |        ["13.45", "16.59", "12.28"] 

B   |        ["13.45", "18.20"]

C   |        ["13.45", "18.20", "19.30"]

我的目标是生成3个标题为ABC的额外列,其中与另一个列的交集将是列字母与之相同的代码百分比那行信。对于列"A",例如:

1

1/3

1/3

对于专栏B

1/2

1

1

等等。我不知道这是否可能与大熊猫或其他包裹,但如果有人可以帮助我,我会非常高兴。请理解我对python的识字率低(并且抱歉我的问题格式很糟糕)。谢谢!

1 个答案:

答案 0 :(得分:0)

您可以使用applyset intersection

对于单个列

In [607]: A = df.query('letter == "A"').code.item()

In [608]: df.code.apply(lambda x: len(set(x).intersection(A))) / len(A)
Out[608]:
0    1.000000
1    0.333333
2    0.333333
Name: code, dtype: float64

In [609]: B = df.query('letter == "B"').code.item()

In [610]: df.code.apply(lambda x: len(set(x).intersection(B))) / len(B)
Out[610]:
0    0.5
1    1.0
2    1.0
Name: code, dtype: float64

In [611]: A
Out[611]: ['13.45', '16.59', '12.28']

In [612]: B
Out[612]: ['13.45', '18.20']

并且,如果您想要一次性所有行

In [628]: pd.DataFrame(
          {r['letter'] : df.code.apply(lambda x: 
           len(set(x).intersection(r['code']))) / len(r['code']) 
           for i, r in df.iterrows()})
Out[628]:
          A    B         C
0  1.000000  0.5  0.333333
1  0.333333  1.0  0.666667
2  0.333333  1.0  1.000000

加入原始数据框

In [629]: pd.DataFrame(
          {r['letter'] : df.code.apply(lambda x: 
           len(set(x).intersection(r['code']))) / len(r['code']) 
           for i, r in df.iterrows()}).join(df)
Out[629]:
          A    B         C letter                   code
0  1.000000  0.5  0.333333      A  [13.45, 16.59, 12.28]
1  0.333333  1.0  0.666667      B         [13.45, 18.20]
2  0.333333  1.0  1.000000      C  [13.45, 18.20, 19.30]