我希望加快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的熊猫中提取任何功能来加快速度吗?或以某种方式矢量化? (在整个数据帧或按分组级别)
答案 0 :(得分:3)
使用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