Разделить список с разным количеством элементов на отдельные столбцы в кадре данных - PullRequest
0 голосов
/ 13 мая 2019

Я извлекаю результаты запросов SQL в мой фрейм данных Pandas.Результаты: «Мин. И Макс.» Или «Мин., Макс. И Среднее».

Min Max Data frame

Я хочу разбить столбец Результаты на отдельные столбцы в существующем фрейме данных.Я попробовал приведенный ниже код

df[["Max","Min", "Average"]] = df.apply(lambda x: pd.Series({"Min_value": x[-1][0], "Max_value": x[-1][1], "Avg_value": x[-1][2]}), axis=1)

Пример вывода:

Data = {'SQL_Query': ['SELECT MIN([Batch_Date_Time]) as Min_value, MAX([Batch_Date_Time]) as Max_value FROM [dbo].[dq_account]', 'SELECT MIN([Trxn_amt]) as Min_value, MAX([Trxn_amt]) as Max_value, AVG([Trxn_amt]) as Avg_value FROM [dbo].[dq_trxn]', 'SELECT MIN([Trxn_date]) as Min_value, MAX([Trxn_date]) as Max_value FROM [dbo].[dq_trxn]'],
                  'Results': ['[2019-04-01 00:00:00, 2099-04-30 00:00:00]', '[-1991.0, 8910.22, 1912.4404615384615]', '[2019-04-01, 2099-04-30]'],
                  'Min':  ['2019-04-01 00:00:00', '-1991.0', '2019-04-01'],
                  'Max': ['2099-04-30 00:00:00', '8910.22', '2099-04-30'],
                  'Avg': ['NA', '1912.4404615384615', 'NA']}

df = pd.DataFrame(Data,columns= ['SQL_Query', 'Results', 'Min', 'Max', 'Avg'])

Но, поскольку элемент «2» не существует в результате запроса 1 и 3, я получаю ошибку -IndexError: ('индекс строки вне диапазона index = 2 len = 2', 'произошел с индексом 0')

Я не понимаю, как устранить эту ошибку.

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

В вашем DF выше, я изменил даты на строки в списке. Векторизованное решение предоставляется tolist ().

pd.concat([df['SQL_Query'],pd.DataFrame(df.Results.values.tolist(), columns=['Min', 'Max', 'Avg'])], axis=1)



    SQL_Query           Min                     Max                     Avg
0   SELECT MIN([Bat...  2019-04-01 00:00:00     2099-04-30 00:00:00     NaN
1   SELECT MIN([Trx...  -1991                   8910.22                 1912.440461
2   SELECT MIN([Trx...  2019-04-01              2099-04-30              NaN

EDIT

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

 "Results": [
        ["2019-04-01 00:00:00", "2099-04-30 00:00:00"],
        [-1991.0, 8910.22, 1912.440461],
        ["2019-04-01", "2099-04-30"],
    ],

Если вы не изменили это, вы получите ошибку, указанную в вашем комментарии. Кроме того, я уверен, что даты, скорее всего, будут объектами datetime, а не строками, как я показал. Но это не должно влиять на результаты.

0 голосов
/ 13 мая 2019

Если ваш SQL-запрос всегда упорядочен: сначала max, затем min, затем Average, вы можете сделать:

def _split(x):
   max_=None if len(x)==2 else x[2]
   return pd.Series({"Min_value": x[0], "Max_value": x[1], "Avg_value": max_})

df[["Max","Min", "Average"]] = df['Results'].apply(lambda x: _split(x),axis=1)

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

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