#python #pandas #dataframe
#python #pandas #сводная
Вопрос:
У меня есть фрейм данных, и я хочу изменить его порядок. Но я не смог получить желаемую форму моей таблицы
df =
id_easy latitude longitude
1 45.0714 7.6187
1 45.0739 7.6195
3 45.0745 7.6152
3 45.0833 7.6145
2 45.0946 7.6194
Желаемый результат:
1 2 3
45.0714 7.6187 45.0946 7.6194 45.0745 7.6152
45.0739 7.6195 45.0946 7.6194
Я пытался:
df_pivot = pd.pivot_table(df,columns = ['id_easy'], values = ['longitude','latitude'])
Комментарии:
1. @anky_91I нужны значения id_easy в виде столбцов
2. на самом деле то же самое,
(df.assign(k=df.groupby('id_easy').cumcount()).set_index(['id_easy','k']) .unstack(0) .sort_values('id_easy',axis=1))
просто открепите на первом уровне, затем
Ответ №1:
Вы можете использовать GroupBy.cumcount
для счетчика, а затем pivot
также для сглаживания MultiIndex
использования f-string
с:
df['g'] = df.groupby('id_easy').cumcount()
df = (df.pivot(index='g', columns='id_easy', values=['longitude','latitude'])
.sort_index(axis=1, level=1))
df.columns = [f'{a}_{b}' for a, b in df.columns]
print (df)
latitude_1 longitude_1 latitude_2 longitude_2 latitude_3 longitude_3
g
0 45.0714 7.6187 45.0946 7.6194 45.0745 7.6152
1 45.0739 7.6195 NaN NaN 45.0833 7.6145
Или используйте set_index
с unstack
(работает также со старыми версиями pandas):
df['g'] = df.groupby('id_easy').cumcount()
df = df.set_index(['g','id_easy']).unstack().sort_index(axis=1, level=1)
df.columns = [f'{a}_{b}' for a, b in df.columns]
print (df)
latitude_1 longitude_1 latitude_2 longitude_2 latitude_3 longitude_3
g
0 45.0714 7.6187 45.0946 7.6194 45.0745 7.6152
1 45.0739 7.6195 NaN NaN 45.0833 7.6145