Слияние значений str в кадре данных на основе индекса повторяющегося значения str? - PullRequest
0 голосов
/ 05 декабря 2018

Я исследовал свою проблему и не могу найти решение.Я пытаюсь перенести большой PDF-документ в таблицу Excel.Когда я извлекаю данные в таблицу, она выглядит следующим образом (извлеченная таблица):

+---------------+-------+----------+
|    details    | text |  volume  |
+---------------+-------+----------+
| 2018-001 - 01 | text1 | Vol. 1   |
| Public        | text1 | pp. 1-13 |
| PDF No.1      | text1 |          |
|               | text1 |          |
| 2018-001 - 02 | text2 | Vol. 1   |
| Public        | text2 | pp. 1-46 |
| PDF No.2      | text2 |          |
| 2018-001 - 03 | text3 | Vol. 1.1 |
| Public        | text3 | pp. 1-47 |
| PDF No.3      | text3 |          |
+---------------+-------+----------+

Если значение в столбце 1 начинается с «2018-001», то я хочу сгруппировать все остальныезначения в одну строку, пока я не достигну следующего «2018-001», как в таблице «Желаемый результат» в моем примере.Я очень ценю любую помощь, я новичок в пандах и пытаюсь найти решение - спасибо.Я опубликую свой код, как только уйду, если я добьюсь прогресса

требуемая таблица:

+-------------------------------+----------------+-------------------+
|            details            |     text      |      volume       |
+-------------------------------+----------------+-------------------+
| 2018-001 - 01 Public PDF No.1 | text1 (joined) | Vol. 1 pp. 1-13   |
| 2018-001 - 02 Public PDF No.2 | text2 (joined) | Vol. 1 pp. 1-46   |
| 2018-001 - 03 Public PDF No.3 | text3 (joined) | Vol. 1.1 pp. 1-47 |
+-------------------------------+----------------+-------------------+

1 Ответ

0 голосов
/ 05 декабря 2018

Когда люди просят текст, они могут работать с вашими данными.Они хотят что-то вроде data = pd.DataFrame(...), а не искусство ASCII (хотя это помогает показать, чего вы хотели бы достичь, поэтому оно не бесполезно).

import pandas as pd
import numpy as np

data = pd.DataFrame(...)
slice_idxes = np.where(data['details'].str.contains('2018-001'))[0].tolist() + [data.shape[0]]

new_data = pd.DataFrame(columns=data.columns)

def idx_gen(idx_list):
    for i in range(len(idx_list) - 1):
        yield idx_list[i], idx_list[i+1]

for start, stop in idx_gen(slice_idxes):
    new_row = data.iloc[start:stop, :]
    new_row = new_row.apply(lambda x: x.str.cat(sep=" ")).to_frame().transpose()
    new_data = new_data.append(new_row)

Это не очень быстро или эффективно, ноэто должно сделать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...