如何将长文本从 .txt 文件插入到 DataFrame

How to insert long text from .txt file to a DataFrame

我正在构建一个 CNN 模型,我必须分析每个时期的训练历史。时代的历史看起来是这样的。此历史记录保存在 .txt 文件中。

Epoch 1/300
11/11 [==============================] - 4s 182ms/step - loss: 8.3641 - accuracy: 0.1382 - f1_m: 0.0676 - precision_m: 0.2398 - recall_m: 0.0408 - lr: 1.0000e-04 - val_loss: 8.6183 - val_accuracy: 0.0952 - val_f1_m: 0.0630 - val_precision_m: 0.1872 - val_recall_m: 0.0379 - val_lr: 1.0000e-04
Epoch 2/300
11/11 [==============================] - 1s 129ms/step - loss: 6.1399 - accuracy: 0.5581 - f1_m: 0.5011 - precision_m: 0.7591 - recall_m: 0.3781 - lr: 1.0000e-04 - val_loss: 6.6084 - val_accuracy: 0.4230 - val_f1_m: 0.1302 - val_precision_m: 0.6426 - val_recall_m: 0.0725 - val_lr: 1.0000e-04
.
.
Epoch 300/300
11/11 [==============================] - 1s 132ms/step - loss: 0.7877 - accuracy: 0.9913 - f1_m: 0.9911 - precision_m: 0.9928 - recall_m: 0.9894 - lr: 1.0000e-04 - val_loss: 1.7068 - val_accuracy: 0.8314 - val_f1_m: 0.8347 - val_precision_m: 0.8433 - val_recall_m: 0.8263 - val_lr: 1.0000e-04

要分析纪元历史,我需要将这些数据填充到 table。在 Python 中,我认为使用 DataFrame 是个好主意。此外,在 DataFrame 的末尾,我还想计算每列的平均值。为了说明,我希望 DataFrame 如下图所示:(我使用 Excel 女士制作的)

我想问的是:

  1. 如何在 .txt 文件上做子字符串以获取 DataFrame column 的所有数据?据我所知,DataFrame 需要 columns 才能获取数据,我目前不知道如何从我的 .txt 文件中获取它。
  2. 如果问题 1 可以解决,如何将值存储在 Python 变量中,然后将其填充到 DataFrame 中?

我假设您可以读取 .txt 文件并将其保存到像 text 这样的变量中。然后您可以执行以下操作:

import pandas as pd


text = '''Epoch 1/300
11/11 [==============================] - 4s 182ms/step - loss: 8.3641 - accuracy: 0.1382 - f1_m: 0.0676 - precision_m: 0.2398 - recall_m: 0.0408 - lr: 1.0000e-04 - val_loss: 8.6183 - val_accuracy: 0.0952 - val_f1_m: 0.0630 - val_precision_m: 0.1872 - val_recall_m: 0.0379 - val_lr: 1.0000e-04
Epoch 2/300
11/11 [==============================] - 1s 129ms/step - loss: 6.1399 - accuracy: 0.5581 - f1_m: 0.5011 - precision_m: 0.7591 - recall_m: 0.3781 - lr: 1.0000e-04 - val_loss: 6.6084 - val_accuracy: 0.4230 - val_f1_m: 0.1302 - val_precision_m: 0.6426 - val_recall_m: 0.0725 - val_lr: 1.0000e-04
Epoch 3/300
11/11 [==============================] - 1s 132ms/step - loss: 0.7877 - accuracy: 0.9913 - f1_m: 0.9911 - precision_m: 0.9928 - recall_m: 0.9894 - lr: 1.0000e-04 - val_loss: 1.7068 - val_accuracy: 0.8314 - val_f1_m: 0.8347 - val_precision_m: 0.8433 - val_recall_m: 0.8263 - val_lr: 1.0000e-04
'''

data = []
for i, line in enumerate(text.split('\n')[1::2], start=1):
    obj = {}
    obj['epoch'] = i
    for x in line.split(' - ')[2:]:
        k, v = x.split(':')
        obj[k] = v.lstrip()
    data.append(obj)

df = pd.DataFrame(data).astype(float)

正在打印 df,我们得到:

|    |   epoch |   loss |   accuracy |   f1_m |   precision_m |   recall_m |     lr |   val_loss |   val_accuracy |   val_f1_m |   val_precision_m |   val_recall_m |   val_lr |
|---:|--------:|-------:|-----------:|-------:|--------------:|-----------:|-------:|-----------:|---------------:|-----------:|------------------:|---------------:|---------:|
|  0 |       1 | 8.3641 |     0.1382 | 0.0676 |        0.2398 |     0.0408 | 0.0001 |     8.6183 |         0.0952 |     0.063  |            0.1872 |         0.0379 |   0.0001 |
|  1 |       2 | 6.1399 |     0.5581 | 0.5011 |        0.7591 |     0.3781 | 0.0001 |     6.6084 |         0.423  |     0.1302 |            0.6426 |         0.0725 |   0.0001 |
|  2 |       3 | 0.7877 |     0.9913 | 0.9911 |        0.9928 |     0.9894 | 0.0001 |     1.7068 |         0.8314 |     0.8347 |            0.8433 |         0.8263 |   0.0001 |

我喜欢将数据存储到 list of dicts 中,因为 DataFrame 会处理列的名称和值。看看 data 是怎样的:

[{'epoch': 1,
  'loss': '8.3641',
  'accuracy': '0.1382',
  'f1_m': '0.0676',
  'precision_m': '0.2398',
  'recall_m': '0.0408',
  'lr': '1.0000e-04',
  'val_loss': '8.6183',
  'val_accuracy': '0.0952',
  'val_f1_m': '0.0630',
  'val_precision_m': '0.1872',
  'val_recall_m': '0.0379',
  'val_lr': '1.0000e-04'},
 {'epoch': 2,
  'loss': '6.1399',
  'accuracy': '0.5581',
  'f1_m': '0.5011',
  'precision_m': '0.7591',
  'recall_m': '0.3781',
  'lr': '1.0000e-04',
  'val_loss': '6.6084',
  'val_accuracy': '0.4230',
  'val_f1_m': '0.1302',
  'val_precision_m': '0.6426',
  'val_recall_m': '0.0725',
  'val_lr': '1.0000e-04'},
 {'epoch': 3,
  'loss': '0.7877',
  'accuracy': '0.9913',
  'f1_m': '0.9911',
  'precision_m': '0.9928',
  'recall_m': '0.9894',
  'lr': '1.0000e-04',
  'val_loss': '1.7068',
  'val_accuracy': '0.8314',
  'val_f1_m': '0.8347',
  'val_precision_m': '0.8433',
  'val_recall_m': '0.8263',
  'val_lr': '1.0000e-04'}]