根据变量值将pandas数据框转换为latex表格

0 投票
1 回答
542 浏览
提问于 2025-04-18 08:46

我有一个很大的数据表

In [25]: df
Out[25]: 
    FN   FP   TN  TP                     data method
0    0    0  980  20  A p=1000 n=1000 SNR=0.5     HF
1    0    0  980  20  A p=1000 n=1000 SNR=0.5     HM
2   16    0  980   4  A p=1000 n=1000 SNR=0.5  HMP80
3   18    0  980   2  A p=1000 n=1000 SNR=0.5  HMP90
4    0    0  980  20  A p=1000 n=1000 SNR=0.5   LP70
5    0    0  980  20  A p=1000 n=1000 SNR=0.5   LP85
6    0    0  980  20  A p=1000 n=1000 SNR=0.5    lCV
7    0   58  922  20   C p=1000 n=200 SNR=0.5     HF
8    0   58  922  20   C p=1000 n=200 SNR=0.5     HM
9   17   13  967   3   C p=1000 n=200 SNR=0.5  HMP80
10  19    7  973   1   C p=1000 n=200 SNR=0.5  HMP90
11   0   58  922  20   C p=1000 n=200 SNR=0.5   LP70
12   0   58  922  20   C p=1000 n=200 SNR=0.5   LP85
13   0   58  922  20   C p=1000 n=200 SNR=0.5    lCV
14   0    0  980  20  B p=1000 n=1000 SNR=0.5     HF
15   0    0  980  20  B p=1000 n=1000 SNR=0.5     HM

我想要生成一个latex格式的表格,要求如下:

1 - 每一行的名称是“method”。

2 - 表格要根据数据的值分成几个块,每个块的标题是数据的值。

3 - 每一行需要有4个块。(这样才能适应页面的大小)

4 - 这些块要按照数据的值进行字母顺序排列。

我试过使用matrix2table这个库,但感觉需要做很多预处理工作。有没有简单的方法可以解决这个问题?我对pandas不太熟悉,也许有一些有用的小技巧。

编辑:这是在latex文档中输出的样子。

An example of output 
      |TP     FP    TN     FN | TP   FP   TN   FN |   .... Other 2 blocks 
method| A p=1000 n=1000   data| A p=1000 n=100    |
HF    | 20    0     980     0 | 3     2    1    1 |
HM    | 20    0     980     0 | 2     5    62   3 |
...
...
----------------------------------------------------------------------------
    | B p=1000 n =100        |  B=1000 n=200      | ..........
HF  | 2      3       4     5 |  32   43    24   24| ..........
HM  | 34     532     23    3 |  23    3    23   23| ..........
...

1 个回答

0

你可能需要对输出的LaTeX格式进行一些调整,但这样做是否有帮助呢?你的数据和输出不完全一致,所以我做了一些假设性的修改。

In [362]: df
Out[362]: 
    FN  FP   TN  TP                     data method
0    0   0  980  20  A p=1000 n=1000 SNR=0.5     HF
1    0   0  980  20  A p=1000 n=1000 SNR=0.5     HM
2   16   0  980   4  A p=1000 n=1000 SNR=0.5  HMP80
3    0  58  922  20   C p=1000 n=200 SNR=0.5     HF
4    0  58  922  20   C p=1000 n=200 SNR=0.5     HM
5   17  13  967   3   C p=1000 n=200 SNR=0.5  HMP80
6    0   0  980  20  B p=1000 n=1000 SNR=0.5     HF
7    0   0  980  20  B p=1000 n=1000 SNR=0.5     HM
8    0   0  980  20   A p=1000 n=100 SNR=0.5     HF
9    0   0  980  20   A p=1000 n=100 SNR=0.5     HM
10  16   0  980   4   A p=1000 n=100 SNR=0.5  HMP80
11   0  58  922  20   C p=1000 n=100 SNR=0.5     HF
12   0  58  922  20   C p=1000 n=100 SNR=0.5     HM
13  17  13  967   3   C p=1000 n=100 SNR=0.5  HMP80
14   0   0  980  20   B p=1000 n=100 SNR=0.5     HF
15   0   0  980  20   B p=1000 n=100 SNR=0.5     HM

In [363]: df['data_group'] = df['data'].str.slice(0,1)

一旦你有了一个列来标识每一组行,下面的代码(使用pandas的groupby功能)会把'data'行转换成列,并将结果写入一个以LaTeX格式保存的文本文件中。

In [377]: with open('latex_table.txt', 'w') as f:
     ...:     header = True
     ...:     for _, df_gb in df.groupby('data_group'):
     ...:         df_gb = df_gb.drop('data_group', axis=1)
     ...:         df_gb = df_gb.pivot(index='method', columns='data')
     ...:         df_gb.columns = df_gb.columns.sortlevel(1)[0]
     ...:         df_gb.to_latex(f, header=header)

撰写回答