Поскольку у вас есть набор данных 2D, а у varX и clusX может быть несколько совпадений, вам нужно решить, что вы хотите делать с этими совпадениями?Я полагаю, вы хотите добавить их.Если это так, вы просматриваете либо фрейм данных со строкой заголовка и одной строкой данных, либо просто серию с индексом, являющимся вашим varX_clusX.
Следующий код сделает это:
# Setup
import pandas as pd
import numpy as np
df = pd.DataFrame({
'var1' : np.random.randint(0, 1000000, 1000000),
'var2' : np.random.randint(0, 1000000, 1000000),
'var3' : np.random.randint(0, 1000000, 1000000),
'cluster' : np.random.randint(0, 100, 1000000)
})
# Processing
# Setup the cluster column for string formatting.
df['cluster'] = 'clus' + df['cluster'].apply(str)
# Un-pivot the cluster column (I'm sure there's a better term)
df = df.set_index('cluster').stack().reset_index()
# Group by the unique combination of cluster / var and sum the values.
# This will generate a column named 0 - which I changed to 'values' just for readability.
df = df.groupby(['cluster','level_1']).sum().reset_index().rename(columns = {0 : 'values'})
# Create the formatted header you're looking for
df['piv'] = df['level_1'] + '_' + df['cluster']
# Final pivot to get the values to align with the the new headers
df = df.pivot(columns = 'piv', values = 'values').sum()
Пришло время на моей машине - примерно 1 с на миллион записей.Не уверен, как быстро вам это нужно.
Если вы не хотите добавлять все значения и есть произвольный индекс, вы можете упростить:
df['cluster'] = 'clus' + df['cluster'].apply(str)
df = df.set_index('cluster').stack().reset_index()
df['piv'] = df['level_1'] + '_' + df['cluster']
df = df.pivot(columns = 'piv', values = 0).fillna(0)
Это даст вам фрейм данныхдлина вашего начального набора данных х количество переменных и тонна нулей.