Pandas слияние строк / преобразование фрейма данных - PullRequest
3 голосов
/ 11 июля 2020

У меня есть этот пример DataFrame:

e   col1    col2    col3
1   238.4   238.7   238.2
2   238.45  238.75  238.2
3   238.2   238.25  237.95
4   238.1   238.15  238.05
5   238.1   238.1   238
6   229.1   229.05  229.05
7   229.35  229.35  229.1
8   229.1   229.15  229
9   229.05  229.05  229

Как я могу преобразовать его в это:

                1                      2            3   
    col1    col2    col3    col1    col2    col3    col1    col2    col3
1   238.4   238.7   238.2   238.45  238.75  238.2   238.2   238.25  237.95
2   238.1   238.15  238.05  238.1   238.1   238     229.1   229.05  229.05
3   229.35  229.35  229.1   229.1   229.15  229    229.05   229.05  229

Я думаю, может быть, мне следует повернуться, подсчитывая с помощью объектива или присвоение индекса, который может быть кратен 3, но я действительно не уверен, что было бы наиболее эффективным способом.

Ответы [ 3 ]

1 голос
/ 11 июля 2020

Данные формируются за три шага, поэтому мы должны выполнить итерацию на этих шагах из 3 и, наконец, объединить по оси столбцов:

pd.concat([df.iloc[n::3].
           reset_index(drop=True).
           set_index(pd.Index([index]*3), 
                     append = True)
           .unstack()
           .swaplevel(1,0, axis=1)
            for n, index in zip(range(0,df.shape[0]//df.shape[1]),
                                range(1, df.shape[1] + 1))], 
          axis = 1)
1 голос
/ 11 июля 2020

Создайте группирующую серию g, это нам понадобится для группировки фрейма данных, чтобы каждый третий элемент (с размером шага 3) принадлежал той же группе, используйте np.unique для получите уникальные ключи группировки, затем используйте DataFrame.groupby, чтобы сгруппировать фрейм данных на g и используйте set_index, чтобы установить индекс каждого сгруппированного фрейма на k, наконец, используйте pd.concat, чтобы объединить все сгруппированные фреймы данных вдоль axis=1 и передать необязательный параметр keys=k для создания MultiLevel столбцов:

g, k = df.pop('e').sub(1) % 3 + 1, np.unique(g)
df1 = pd.concat([g.set_index(k) for _, g in df.groupby(g)], keys=k, axis=1)

Подробности:

print(g.tolist())
[1, 2, 3, 1, 2, 3, 1, 2, 3]

print(k)
array([1, 2, 3])

Результат :

print(df1)

        1                       2                      3                
     col1    col2    col3    col1    col2   col3    col1    col2    col3
1  238.40  238.70  238.20  238.45  238.75  238.2  238.20  238.25  237.95
2  238.10  238.15  238.05  238.10  238.10  238.0  229.10  229.05  229.05
3  229.35  229.35  229.10  229.10  229.15  229.0  229.05  229.05  229.00
0 голосов
/ 11 июля 2020

Используя методы pandas и пошаговый подход:

df['id1'] = (df.e+2) % 3 + 1
df['id2'] = df['id1']
df.loc[df['id1']>1,'id2']=np.nan
df['id2'] = df['id2'].cumsum().ffill()
df2 = df.drop(columns='e').melt(id_vars = ['id1','id2'])

df3 = pd.pivot_table(df2, index = 'id2', columns = ['id1','variable'], values = 'value').reset_index(drop=True)
df3.index += 1
df3.columns.names = ['',''] 

результат:

        1                       2                      3                
     col1    col2    col3    col1    col2   col3    col1    col2    col3
1  238.40  238.70  238.20  238.45  238.75  238.2  238.20  238.25  237.95
2  238.10  238.15  238.05  238.10  238.10  238.0  229.10  229.05  229.05
3  229.35  229.35  229.10  229.10  229.15  229.0  229.05  229.05  229.00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...