Ускорьте создание панд попарно - PullRequest
0 голосов
/ 27 ноября 2018

Я хочу ускорить функцию группирования кадров данных pandas для выполнения парного сравнения.

Для данного фрейма данных в нем есть столбцы [x1, x2, x3, x4] со многими строками.(есть миллионы строк)

Я хочу сгруппировать по [x1].(будет десятки тысяч групп)

Затем возьмите первую строку каждой группировки, продублируйте строку N раз, где N - количество строк в группе.Переименуйте заголовки столбцов в: [y1, y2, y3, y4], затем объедините их с исходной группой.

Моя исходная таблица с заголовком:

[x1, x2, x3, x4]
[1, 'p', 45, 62]
[1, 'k', 12, 84]

Перейдите на:

[y1, y2, y3, y4, x1, x2, x3, x4]
[1, 'p', 45, 62, 1, 'p', 45, 62]
[1, 'p', 45, 62, 1, 'k', 12, 84]

Я могу обрабатывать его несколько раз, но он все еще довольно медленный, моя текущая версия.

for name, group in dataframe.groupby(['x1']):
    # take first row and make dataframe
    duplicated_row = pd.concat([group.iloc[[0]]]*len(group), ignore_index = True)

    # create new headers
    new_headers = [x.replace('v2', 'v1') for x in list(duplicated_row)]
    column_names2 = dict(zip(list(duplicated_row), new_headers))

    # rename headers
    duplicated_row = duplicated_row.rename(index=str, columns=column_names2)
    duplicated_row = duplicated_row.reset_index(drop=True)

    # concat two dataframes
    full_df = pd.concat([duplicated_row, group.reset_index(drop=True)], axis = 1)

Есть ли какие-нибудь функции, которые я могу извлечь из панд, которые являются родными C, чтобы ускорить это?или это как-то векторизовать?(на весь фрейм данных или на уровне группы)

1 Ответ

0 голосов
/ 27 ноября 2018

Используйте groupby и transform и concat результаты.

i = df['x1'].rename('y1')
j = df.groupby('x1').transform('first')
j.columns = 'y' + j.columns.str[1:]

df = pd.concat([i, j, df], axis=1)
print(df)
   y1 y2  y3  y4  x1 x2  x3  x4
0   1  p  45  62   1  p  45  62
1   1  p  45  62   1  k  12  84
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...