#python #data-manipulation
Вопрос:
Здравствуйте, у меня есть фрейм данных, который выглядит как 1, и я хотел бы сделать его равным 2. Как проще всего это сделать на Python? Спасибо
Комментарии:
1. Правила сайта требуют, чтобы вы показали свою попытку решить проблему.
2. похоже, что некоторые
pivot
илиreshape
около того ищут эти два слова вpandas
)3. самый простой способ получить ответ-поместить примеры данных в виде текста (в виде фрейма данных), который мы можем просто скопировать и использовать в решении. Когда вы помещаете данные в виде изображения, вы можете забыть об ответе. Проще отказаться от этого и закрыть вопрос.
4. Возможно, вы также ищете
melt
5. Пожалуйста, предоставьте достаточно кода, чтобы другие могли лучше понять или воспроизвести проблему.
Ответ №1:
Вы можете использовать for-цикл для работы с каждым столбцом отдельно, а затем добавить его в новый фрейм данных
Сначала получите столбцы Code
State1_data
,
затем получите строку State1
из строки State1_data
и создайте столбец State
с этим значением. Затем переименуйте столбец State1_data
в data
. Наконец append
— то это к новому DataFrame
.
И повторите это для других колумов.
import pandas as pd data = { 'Code': [1,2,3], 'State1_data': ['A','B','C'], 'State2_data': ['D','E','F'], 'State3_data': ['G','H','I'], } # columns df = pd.DataFrame(data) print(df) # create new DataFrame for result new_df = pd.DataFrame() # get names which start with `State` #columns = ['State1_data', 'State2_data', 'State3_data'] columns = [name for name in df.columns if name.startswith('State')] for col in columns: # get columns `Code`, `State1_data` temp_df = df[['Code', col]].copy() # add value `State1` to column `State` temp_df['State'] = col.split('_')[0] # rename `State1_data` to `data` temp_df = temp_df.rename(columns={col: 'data'}) # append to new DataFrame new_df = new_df.append(temp_df) # --- # change order new_df = new_df[ ['Code', 'State', 'data'] ] # reset index new_df = new_df.reset_index(drop=True) print(new_df)
Результат:
Code State1_data State2_data State3_data 0 1 A D G 1 2 B E H 2 3 C F I Code State data 0 1 State1 A 1 2 State1 B 2 3 State1 C 3 1 State2 D 4 2 State2 E 5 3 State2 F 6 1 State3 G 7 2 State3 H 8 3 State3 I
Редактировать:
Теперь я вижу, что вы используете Code
в качестве индекса — так что он нуждается в небольших изменениях
import pandas as pd data = { 'Code': [1,2,3], 'State1_data': ['A','B','C'], 'State2_data': ['D','E','F'], 'State3_data': ['G','H','I'], } # columns df = pd.DataFrame(data) df.index = df['Code'] del df['Code'] print(df) # create new DataFrame for result new_df = pd.DataFrame() # get names which start with `State` #columns = ['State1_data', 'State2_data', 'State3_data'] #columns = [name for name in df.columns if name.startswith('State')] columns = df.columns for col in columns: # get columns `Code`, `State1_data` temp_df = df[[col]].copy() # add value `State1` to column `State` temp_df['State'] = col.split('_')[0] # rename `State1_data` to `data` temp_df = temp_df.rename(columns={col: 'data'}) # append to new DataFrame new_df = new_df.append(temp_df) # --- # change order new_df = new_df[ ['State', 'data'] ] print(new_df)
Результат:
State1_data State2_data State3_data Code 1 A D G 2 B E H 3 C F I State data Code 1 State1 A 2 State1 B 3 State1 C 1 State2 D 2 State2 E 3 State2 F 1 State3 G 2 State3 H 3 State3 I