Предоставлено список GIT сообщений, где мерзавец коммит может следовать список измененных файлов, insertations и делеции, таких как следующие:панды: Чтение многострочного CSV, как вход с различными разделителями
import pandas as pd
from io import StringIO
data = '''\
f0a332fc65|User 1|2017-01-30 17:26:51|Merge branch 'dev' into master
877134c7be|User 1|2017-01-30 14:46:55|commitmsg 1
1 file changed, 15 insertions(+)
557b90502d|User 1|2017-01-30 14:38:52|commitmsg 2
10 files changed, 51 insertions(+), 56 deletions(-)
052788be45|User 2|2017-01-30 14:29:28|commitmsg 3
1 file changed, 1 deletion(-)
'''
df = pd.read_csv(StringIO(data), ????)
Каждый за информацией об изменениях следует пустая строка, как показано в примере выше. Но не все коммиты разделяются пустой строкой (см. Первую строку, которая является фиксацией слияния, которая сама по себе не имеет информации об изменении).
Как будет выглядеть трансформация, которая дает следующий DataFrame?
sha1 author date message \
0 f0a332fc65 User 1 2017-01-30 17:26:51 Merge branch 'dev' into master
1 877134c7be User 1 2017-01-30 14:46:55 commitmsg 1
2 557b90502d User 1 2017-01-30 14:38:52 commitmsg 2
3 052788be45 User 2 2017-01-30 14:29:28 commitmsg 3
changes insertions deletions
0 NaN NaN NaN
1 1.0 15.0 NaN
2 10.0 51.0 56.0
3 1.0 NaN 1.0
Этот вопрос может быть связан с несколькими входами линии, как обсуждалось here, но несколько сложнее.
У меня есть working solution, который читает файл на python и по существу извлекает информацию об изменении отдельно от остальной части и затем объединяет два DataFrames. Я думаю, что это можно сделать быстрее, без необходимости читать файл через python, но использовать только методы pandas io.
Было бы хорошо, если бы вы смогли продемонстрировать решение, которое у вас есть, чтобы мы могли видеть, возможно ли сделать его более эффективным. И я считаю, что вы должны обрабатывать данные, прежде чем загружать их в DataFrame, так как это «непоследовательно» (варьируется количество строк перед каждой строкой). – hooy
@hooy Спасибо за ваш ответ. Я загрузил свой код [здесь] (https://gist.github.com/dotcs/ea90eb3939ed8723c685a0ef6e045f73). Обратите внимание, что в моей собственной реализации коммиты слияния не отображаются, потому что я сосредоточился только на фиксациях, которые внесли изменения в базу кода. – dotcs