我遇到了在python中创建混淆矩阵的问题。我目前有以下csv文件,其中一个表组织在两列中,如下所示:
----------
Letter | Code
A | ["13.45", "16.59", "12.28"]
B | ["13.45", "18.20"]
C | ["13.45", "18.20", "19.30"]
我的目标是生成3个标题为A
,B
和C
的额外列,其中与另一个列的交集将是列字母与之相同的代码百分比那行信。对于列"A"
,例如:
1
1/3
1/3
对于专栏B
:
1/2
1
1
等等。我不知道这是否可能与大熊猫或其他包裹,但如果有人可以帮助我,我会非常高兴。请理解我对python的识字率低(并且抱歉我的问题格式很糟糕)。谢谢!
答案 0 :(得分:0)
您可以使用apply
和set
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]