Как объединить несколько строк в одну строку и повторить эту операцию на большом фрейме данных? - PullRequest
0 голосов
/ 03 июля 2019

Я работаю с фреймом данных, содержащим 582 260 строк и 24 столбца.Каждая строка соответствует 24-часовому временному ряду длины вектора, а 20 строк (дней) соответствуют id_1, 20 - id_2 ... и т. Д. До id_N.Я хотел бы объединить в одну строку все 20 строк id_1, чтобы мой объединенный временной ряд стал иметь длину вектора 480 (20 дней * 24 часа / сутки), и повторить эту операцию с id_1 до id_N.

Показана очень уменьшенная и воспроизводимая версия моего фрейма данных (столбец ID должен быть индексом, но для целей итерации я его переустановил):

df = pd.DataFrame([['id1', 1, 1, 3, 4, 1], ['id1', 0, 1, 5, 2, 1], ['id1', 3, 4, 5, 0, 0], 
                   ['id2', 1, 1, 8, 0, 6], ['id2', 5, 3, 1, 1, 2], ['id2', 5, 4, 5, 2, 7]],
                  columns = ['ID', 'h0', 'h1', 'h2', 'h3', 'h4'] )

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

def concatenation(df):
    for i, row in df.iterrows():
        if df.ix[i]['ID'] == df.ix[i+1]['ID']:
            pd.concat([df], axis = 1)
            return(df)

concatenation(df)

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

df = pd.DataFrame([['id1', 1, 1, 3, 4, 1, 0, 1, 5, 2, 1, 3, 4, 5, 0, 0], 
                   ['id2', 1, 1, 8, 0, 6, 5, 3, 1, 1, 2, 5, 4, 5, 2, 7]],
                  columns = ['ID', 'h0', 'h1', 'h2', 'h3', 'h4', 
                             'h0', 'h1', 'h2', 'h3', 'h4',
                             'h0', 'h1', 'h2', 'h3', 'h4'])

Существует ли компактный и элегантный способпрограммирование этой задачи с помощью инструментов pandas?

Заранее благодарим за помощь.

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Сначала добавьте столбец day, а затем создайте иерархический индекс ID и day, который затем будет разобран:

df['day'] = df.groupby('ID').cumcount()
df = df.set_index(['ID','day'])
res = df.unstack()

Промежуточный результат:

      h0       h1       h2       h3       h4      
day    0  1  2  0  1  2  0  1  2  0  1  2  0  1  2
ID                                                
id1    1  0  3  1  1  4  3  5  5  4  2  0  1  1  0
id2    1  5  5  1  3  4  8  1  5  0  1  2  6  2  7

Теперь мы сгладим индекс и изменим порядок столбцов в соответствии с запросом:

res.set_axis([f"{y}{x}" for x, y in res.columns], axis=1, inplace=True)
res = res.reindex(sorted(res.columns), axis=1)

Окончательный результат:

     0h0  0h1  0h2  0h3  0h4  1h0  1h1  1h2  1h3  1h4  2h0  2h1  2h2  2h3  2h4
ID                                                                            
id1    1    1    3    4    1    0    1    5    2    1    3    4    5    0    0
id2    1    1    8    0    6    5    3    1    1    2    5    4    5    2    7
0 голосов
/ 03 июля 2019

Вы можете использовать методы defaultdict(list) и .extend() для сохранения всех значений в точном порядке и для создания того же вывода, который вы определили.

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

...