Реконструировать / разбивать массив списков на несколько строк для вывода в CSV - PullRequest
0 голосов
/ 31 марта 2020

У меня есть куча задач, которые нужно равномерно распределить по диапазону дат.

Списки задач всегда содержат 5 элементов, исключая последний блок, который будет варьироваться от 1 до 5 элементов.

Процесс, который я собрал, выдает следующую структуру данных:

[{'Project': array([['AAC789A'],
       ['ABL001A'],
       ['ABL001D'],
       ['ABL001E'],
       ['ABL001X']], dtype=object), 'end_date': '2020-10-01'}, 
{'Project': array([['ACZ885G_MA'],
       ['ACZ885H'],
       ['ACZ885H_MA'],
       ['ACZ885I'],
       ['ACZ885M']], dtype=object), 'end_date': '2020-10-02'}, 
 {'Project': array([['IGE025C']], dtype=object), 'end_date': '2020-10-03'}]

... но мне действительно нужен следующий формат ...

Project,end_date
AAC789A,2020-10-01
ABL001A,2020-10-01
ABL001D,2020-10-01
ABL001E,2020-10-01
ABL001X,2020-10-01
ACZ885G_MA,2020-10-02
ACZ885H,2020-10-02
ACZ885H_MA,2020-10-02
ACZ885I,2020-10-02
ACZ885M,2020-10-02
IGE025C,2020-10-03

Я посмотрел на повторяя и цепляясь, используя itertools, но я, кажется, никуда не денусь с этим.

Я впервые много работаю с Python. Как это обычно достигается в Python?

Вот как я сейчас пытаюсь это сделать, но я получаю ошибку ниже.

df = pd.concat([pd.Series(row['end_date'], row['Project'].split(','))
                    for _, row in df.iterrows()]).reset_index()


AttributeError: 'numpy.ndarray' object has no attribute 'split'

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

здесь у вас есть решение с использованием метода numpy flatten:

import pandas as pd
import numpy as np


data = [{'Project': np.array([['AAC789A'],
       ['ABL001A'],
       ['ABL001D'],
       ['ABL001E'],
       ['ABL001X']], dtype=object), 'end_date': '2020-10-01'}, 
{'Project': np.array([['ACZ885G_MA'],
       ['ACZ885H'],
       ['ACZ885H_MA'],
       ['ACZ885I'],
       ['ACZ885M']], dtype=object), 'end_date': '2020-10-02'}, 
 {'Project': np.array([['IGE025C']], dtype=object), 'end_date': '2020-10-03'}]

clean = lambda di : { 'Project': di['Project'].flatten(), 'end_date': di['end_date']}
result = pd.concat([pd.DataFrame(clean(d)) for d in data])

result - это кадр данных, который можно экспортировать в формат CSV. Он содержит следующее:

Project,end_date
AAC789A,2020-10-01
ABL001A,2020-10-01
ABL001D,2020-10-01
ABL001E,2020-10-01
ABL001X,2020-10-01
ACZ885G_MA,2020-10-02
ACZ885H,2020-10-02
ACZ885H_MA,2020-10-02
ACZ885I,2020-10-02
ACZ885M,2020-10-02
IGE025C,2020-10-03
0 голосов
/ 31 марта 2020

Я нашел ответ, который удовлетворил мою потребность. См. Ссылку ниже - ответ MaxU помог мне лучше всего.

Используя его метод разнесения, я смог достичь sh своей цели с помощью одной строки кода.

df2 = explode(df.assign(var1=df.Project.str.split(',')), 'Project')

Разделить (взорвать) pandas запись строки в информационном фрейме для разделения строк

...