Панды - Добавить список в несколько столбцов (для нескольких строк) - PullRequest
0 голосов
/ 26 июня 2018

У меня есть список значений, которые я хочу обновить в несколько столбцов, это хорошо для одной строки.Однако, когда я пытаюсь обновить несколько строк, он просто переопределяет весь столбец последним значением.

Список для каждой строки выглядит следующим образом (примечание: длина списка имеет переменный размер):

['2016-03-16T09:53:05',
 '2016-03-16T16:13:33',
 '2016-03-17T13:30:31',
 '2016-03-17T13:39:09',
 '2016-03-17T16:59:01',
 '2016-03-23T12:20:47',
 '2016-03-23T13:22:58',
 '2016-03-29T17:26:26',
 '2016-03-30T09:08:17']

Я могу сохранить это в пустых столбцах, используя:

for i in range(len(trans_dates)):
    df[('T' + str(i + 1) + ' - Date')] = trans_dates[i]

Однако это обновляет весь столбец с единственным значением trans_dates[i]

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

for issues in all_issues:
    for i in range(len(trans_dates)):
        df[('T' + str(i + 1) + ' - Date')] = trans_dates[i]
  • Как мне обновить только текущую строку в цикле?
  • Я дажеидти по этому пути правильно?Или есть более быстрый векторизованный способ сделать это?

Полный фрагмент кода ниже:

for issues in all_issues:
    print(issues)
    changelog = issues.changelog
    trans_dates = []
    from_status = []
    to_status = []
    for history in changelog.histories:
        for item in history.items:
            if item.field == 'status':
                trans_dates.append(history.created[:19])
                from_status.append(item.fromString)
                to_status.append(item.toString)
    trans_dates = list(reversed(trans_dates))
    from_status = list(reversed(from_status))
    to_status = list(reversed(to_status))
    print(trans_dates)

    # Store raw data in created columns and convert dates to pd.to_datetime
    for i in range(len(trans_dates)):
        df[('T' + str(i + 1) + ' - Date')] = trans_dates[i]
    for i in range(len(to_status)):
        df[('T' + str(i + 1) + ' - To')] = to_status[i]
    for i in range(len(from_status)):
        df[('T' + str(i + 1) + ' - From')] = from_status[i]
    for i in range(len(trans_dates)):
        df['T' + str(i + 1) + ' - Date'] = pd.to_datetime(df['T' + str(i + 1) + ' - Date'])
  • РЕДАКТИРОВАТЬ: добавлены примеры ввода и вывода.

вход: список выпусков / строк № 1 (обратите внимание на изменение года):

    ['2016-03-16T09:53:05',
     '2016-03-16T16:13:33',
     '2016-03-17T13:30:31',
     '2016-03-17T13:39:09']

выпуск № 2

['2017-03-16T09:53:05',
 '2017-03-16T16:13:33',
 '2017-03-17T13:30:31']

выпуск #3

['2018-03-16T09:53:05',
 '2018-03-16T16:13:33',
 '2018-03-17T13:30:31']

выпуск # 4

['2015-03-16T09:53:05',
 '2015-03-16T16:13:33']

вывод:

        col       T1                     T2                      T3                 T4
        17 '2016-03-16T09:53:05'   '2016-03-16T16:13:33'  '2016-03-17T13:30:31'  '2016-03-17T13:30:31'
        18 '2017-03-16T09:53:05'   '2017-03-16T16:13:33'  '2017-03-17T13:30:31'  np.nan
        19 '2018-03-16T09:53:05'   '2018-03-16T16:13:33'  '2018-03-17T13:30:31' np.nan
        20 '2015-03-16T09:53:05'   '2015-03-16T16:13:33'      np.nan     np.nan

1 Ответ

0 голосов
/ 26 июня 2018

Вместо этого:

for i in range(len(trans_dates)):
    df[('T' + str(i + 1) + ' - Date')] = trans_dates[i]

Попробуйте это:

for i in range(len(trans_dates)):
    df.loc[i, ('T' + str(i + 1) + ' - Date')] = trans_dates[i]  

Возможно, есть лучшие способы сделать это ... df.merge или df.replace приходят на ум.... было бы полезно, если бы вы опубликовали, как выглядит входной фрейм данных и каков ожидаемый результат.

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