Строки панд в ячейках к новым строкам - PullRequest
0 голосов
/ 25 октября 2018

Я пытался найти что-то, что использовало бы панд для создания кадра данных из имеющегося у меня csv.Проблема в том, что мой второй столбец представляет собой строку дат, за которой следуют примечания.Я не могу использовать это в этом формате.Я искал пост с похожим форматом, но не могу его найти.Я уверен, что ответ более очевиден, чем я думаю, но сейчас я слишком близок к проблеме, поэтому любая помощь будет принята с благодарностью.

У меня есть CSV, который выглядит так:

Order          Notes

123456    "[oct-10-28] some stuff about the client
           [oct-15-18] some more notes about the client
           [nov-19-18] made some changes to account"

789456    "[oct-1-18] idk why it doesn't work
           [oct-20-18] client is mad"

что мне нужно в качестве вывода:

Order     Notes

123456  oct-10-28
123456  oct-15-18 
123456  nov-19-18 
789456  oct-1-18
789456  oct-20-18

*** Редактировать

Я попробовал решения, предложенные piRSquared и Wen, и все они имели одинаковыерезультат, поэтому я добавляю дополнительную информацию, чтобы увидеть, если вы можете помочь.Я думаю, может быть, у меня проблема с форматированием или что-то в этом роде.

base_ops_df.head(5)

enter image description here

* извините, не уверен, как легко получить этот вывод здесь

import re

pd.DataFrame(
    [[o, d] for o, n in zip(*map(base_ops_df_test.get, ['Order', 'Notes']))
     for d in re.findall('\[([\w-]+)\]', n)],
    columns=base_ops_df_test.columns
)

enter image description here

Спасибо за всю вашу помощь в этом, я сейчас совершенно ошарашен.

Ответы [ 4 ]

0 голосов
/ 26 октября 2018

Если кто-нибудь из вас сможет решить проблему с использованием панд, я все же хочу понять, как это работает, и найти решение.Однако ради соблюдения сроков я решил преобразовать свой фрейм данных в пустой массив, выполнить свою работу и затем преобразовать его обратно.Вот как я это сделал:

base_ops_df.Order = pd.Series(base_ops_df.Order, dtype='category')
base_ops_df.Notes = pd.Series(base_ops_df.Notes, dtype='str')

base_ops_array = np.array(base_ops_df)
the_big_list = []

for row in base_ops_array:
    rows = str(row)
    row_string = rows.split(' ')
    for element in row_string:
        if "[" in element:
            list_dates = [row[0], element]
            the_big_list.append(list_dates)

operations_dates = pd.DataFrame(the_big_list, columns=['Related_Order', 'Dates'])
operations_date = operations_dates[~operations_dates['Dates'].astype(str).str.contains('\n')]
crap_to_replace = ["'", "[", "[["]
operations_date.Dates = operations_date.Dates.str.replace("'", "")
operations_date.Dates = operations_date.Dates.str.replace("[", "")

operations_date.head(100)

Это явно не такое элегантное решение, но оно сработало.

0 голосов
/ 26 октября 2018

Понимание и re.findall

import re

pd.DataFrame(
    [[o, d] for o, n in zip(*map(df.get, ['Order', 'Notes']))
     for d in re.findall('\[([\w-]+)\]', n)],
    columns=df.columns
)

    Order      Notes
0  123456  oct-10-28
1  123456  oct-15-18
2  123456  nov-19-18
3  789456   oct-1-18
4  789456  oct-20-18

itertools.chain и более

from itertools import chain

n = df.Notes.str.findall('\[([\w-]+)\]')
pd.DataFrame(
    [*zip(df.Order.repeat(n.str.len()), chain(*n))],
    columns=df.columns
)

Настройка

Notes = ["""[oct-10-28] some stuff about the client
[oct-15-18] some more notes about the client
[nov-19-18] made some changes to account
""",
"""[oct-1-18] idk why it doesn't work
[oct-20-18] client is mad"""]

df = pd.DataFrame(dict(
    Order=[123456, 789456],
    Notes=Notes
), columns=['Order', 'Notes'])
0 голосов
/ 26 октября 2018

Использование extractall

df.set_index('Order').Notes.str.extractall('\[([\w-]+)\]').reset_index('match',drop=True)
Out[405]: 
                0
Order            
123456  oct-10-28
123456  oct-15-18
123456  nov-19-18
789456   oct-1-18
789456  oct-20-18
0 голосов
/ 25 октября 2018

Попробуйте разделить и нарезать

a = "[oct-10-28] some stuff about the client"
b = a.split(sep=']')[0][1:]
print(b)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...