加快大熊猫成对创作

时间:2018-11-27 03:07:56

标签: python pandas pandas-groupby

我希望加快pandas数据框groupby函数的执行,以进行成对比较。

对于给定的数据帧,它具有具有许多行的列[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 :(得分:3)

使用groupbytransform,并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