Заполните значения ячеек по индексу и столбцу в пандах из внешнего списка - PullRequest
1 голос
/ 13 июня 2019

Я пытаюсь заполнить фрейм данных, просматривая значения в списке списков и пытаясь найти соответствие для столбца / индекса. Я нашел этот пост и подумал, что могу изменить его для своих нужд. заполнить всю ячейку данных за ячейкой на основе индекса И имен столбцов? . Он заполняет свой фрейм данных панд, используя функцию edit_distance. В настоящее время я пытаюсь изменить эту функцию, чтобы она выводила фактические данные.

Мой набор данных выглядит примерно так, но со многими другими значениями:

Data = [Product Number, Date, Quantity]
       [X1          , 2018-01, 2]
       [X1,         , 2018-02, 4]
       [X1,         , 2018-03, 7]
       [X2,         , 2018-01, 3]
       [X3,         , 2018-02, 5]
       [X3,         , 2018-03, 6]

Ожидаемый результат: извинения за грубое представление

DF = 2018-01 2018-02- 2018-03
  X1  2         4        7
  X2  3             
  X3            5        6

Я дедуплицировал все номера продуктов и даты в моем списке списков и установил их равными приведенным ниже, как он делал это в вопросе стека, на который ссылаются.

series_rows = pd.Series(prod_deduped)
series_cols = pd.Series(dates_deduped)

Его код для отображения всех ячеек:

df = pd.DataFrame(series_rows.apply(lambda x: series_cols.apply(lambda y: edit_distance(x, y))))

Часть, начинающаяся с edit_distance, является функцией, которая возвращает значение на основе входных данных для x, y. Я создал свою собственную функцию, которая будет перебирать список списков и возвращать значение, основанное на совпадении.

def return_value(s1, s2, list_of_lists, starting_point_in_case_of_header):
    for row in list_of_lists[starting_point_in_case_of_header:]:
        result = ''
        product = row[0]
        date = row[1]
        quantity = row[2]
        #for prod in product:
        if product == s1 and date == s2:
            result = quantity
        return result

Я получаю совпадение в строке 1, столбце 1, но все остальное пустое, что заставляет меня думать, что мне действительно нужно пройти через s1 или s2, прежде чем все остальное. Любая помощь будет оценена. Спасибо!

РЕДАКТИРОВАТЬ: Вот моя самая последняя попытка перебрать s1 и s2, но это просто ошибка из-за того, что мой индекс списка находится вне диапазона. Я думаю, что я на правильном пути.

def return_value(s1, s2, list_of_lists, starting_point_in_case_of_header):
    for y in enumerate(s2):
        result_ = []
        for x in enumerate(s1):
            for row in list_of_lists[starting_point_in_case_of_header:]:
                product = row[0]
                date = row[1]
                quantity = row[2]
                if product == x and date == y:
                    result_.append(quantity)
        result = result_
    return result[-1]

Мой окончательный код, чтобы собрать все воедино:

result_df = pd.DataFrame(series_rows.apply(lambda x: series_cols.apply(lambda y: return_value(x, y, sorted_deduped_list, 0))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...