pandas python передвинуть столбец
Есть такая таблица
| показатель | 2021(1) | 2021(2) | 2022(1) | 2022(2) |
|---|---|---|---|---|
| a | 143 | 24 | 124 | 324 |
| b | 234 | 1 | 324 | 6583 |
| c | 2544 | 123 | 3424 | 61583 |
| d | 67 | 99 | 538 | 1000 |
Я хочу привести ее к следующему виду:
| показатель | полугодие | 2021 | 2022 |
|---|---|---|---|
| a | 1 | 143 | 324 |
| a | 2 | 24 | 324 |
| b | 1 | 234 | 324 |
| b | 2 | 1 | 6583 |
| c | 1 | 2544 | 3424 |
| c | 2 | 123 | 61583 |
| d | 1 | 67 | 538 |
| d | 2 | 99 | 1000 |
то есть вытащить столбцы в пометкой (2)
Ответы (3 шт):
Автор решения: CrazyElf
→ Ссылка
Наверное можно короче, но я чисто "в лоб" всё сделал:
import pandas as pd
data = """показатель 2021(1) 2021(2) 2022(1) 2022(2)
a 143 24 124 324
b 234 1 324 6583
c 2544 123 3424 61583
d 67 99 538 1000""".split('\n')
data = list(map(str.split, data))
df = pd.DataFrame(data[1:], columns=data[0])
df_list = []
for i in range(1, 3):
columns = [col for col in df.columns if '(' not in col or f'({i})' in col]
new_columns = [col.split('(')[0] for col in columns]
df_tmp = df[columns].copy()
df_tmp.columns = new_columns
df_tmp['полугодие'] = i
new_columns.insert(1, 'полугодие')
df_list.append(df_tmp[new_columns])
df_new = pd.concat(df_list).sort_values(['показатель','полугодие'])
df_new
показатель полугодие 2021 2022
0 a 1 143 124
0 a 2 24 324
1 b 1 234 324
1 b 2 1 6583
2 c 1 2544 3424
2 c 2 123 61583
3 d 1 67 538
3 d 2 99 1000
Автор решения: strawdog
→ Ссылка
Ну вот еще вариант для разнообразия:
import re
df.columns = df.columns.str.replace(r"\(.\)$", "", regex=True)
res = pd.concat([pd.concat([df["показатель"],df.iloc[:,1::2]], axis=1),
pd.concat([df["показатель"],df.iloc[:,2::2]], axis=1)]).groupby("показатель").apply(lambda x:x)
res.index = [1 if not x&1 else 2 for x in res.index]
res.index.name = "полугодие"
res = res.reset_index()
res:
полугодие показатель 2021 2022
0 1 a 143 124
1 1 a 24 324
2 2 b 234 324
3 2 b 1 6583
4 1 c 2544 3424
5 1 c 123 61583
6 2 d 67 538
7 2 d 99 1000
Автор решения: SergFSM
→ Ссылка
альтернативный подход:
res = (df.melt(id_vars='показатель').
assign(год=lambda x: x.variable.str[:4], полугодие=lambda x: x.variable.str[5]).
pivot(index=['показатель','полугодие'],columns='год',values='value'))
print(res)
'''
год 2021 2022
показатель полугодие
a 1 143 124
2 24 324
b 1 234 324
2 1 6583
c 1 2544 3424
2 123 61583
d 1 67 538
2 99 1000