#python-3.x #pandas
#python-3.x #pandas
Вопрос:
Вопрос для начинающих: У меня есть матрица, скажем, 3×3, и я хочу преобразовать ее в формат long следующим образом :
Широкий :
A B C
A 0.1 0.2 0.3
B 0.1 0.2 0.3
C 0.1 0.2 0.3
Длинный :
Col1 Col2 Row_num Col_num Value
0 A A 1 1 0.1
1 A B 1 2 0.2
2 A C 1 3 0.3
.
.
8 C C 3 3 0.3
Я пробовал различные функции, такие как melt, unstack (), wide_to_long, но не могу получить номер столбца. Каков наилучший способ сделать это?
Спасибо
Ответ №1:
Создайте данные и распакуйте значения
df = pd.DataFrame({'A': [0.1, 0.1, 0.1],
'B': [0.2, 0.2, 0.2],
'C': [0.3, 0.3, 0.3]},
index=['A', 'B', 'C'])
mapping = {col: idx for idx, col in enumerate(df.columns, 1)}
df = df.unstack().to_frame().reset_index()
df.columns = ['Col1', 'Col2', 'Value']
Фрейм данных
>>> df
Col1 Col2 Value
0 A A 0.1
1 A B 0.1
2 A C 0.1
3 B A 0.2
4 B B 0.2
5 B C 0.2
6 C A 0.3
7 C B 0.3
8 C C 0.3
Сопоставьте оставшиеся значения
>>> df.assign(
Row_num=df['Col1'].map(mapping),
Col_num=df['Col2'].map(mapping)
)
Вывод
Col1 Col2 Value Row_num Col_num
0 A A 0.1 1 1
1 A B 0.1 1 2
2 A C 0.1 1 3
3 B A 0.2 2 1
4 B B 0.2 2 2
5 B C 0.2 2 3
6 C A 0.3 3 1
7 C B 0.3 3 2
8 C C 0.3 3 3
Комментарии:
1. Привет, спасибо за ответ.. Я думаю, вы неправильно поняли вопросы, поэтому я обновил их с помощью других значений и названий столбцов. Пожалуйста, взгляните. Спасибо
Ответ №2:
Я уверен, что есть более эффективный способ сделать это, поскольку мой метод включает два цикла for, но это быстрый и грязный способ преобразовать данные, которые вы ищете:
# df is your initial dataframe
df = pd.DataFrame({"A": [1,1,1],
"B": [2,2,2],
"C": [3,3,3]},
index=["A","B","C"])
#long_rows will store the data we need for the new df
long_rows = []
# loop through each row
for i in range(len(df)):
#loop through each column
for j in range(len(df.columns)):
ind = list(df.index.values)[i]
col = list(df.columns.values)[j]
val = df.iloc[i,j]
row = [ind, col, i 1, j 1, val]
long_rows.append(row)
new_df = pd.DataFrame(long_rows, columns=["Col1", "Col2", "Row1", "Row2", "Value"])
и результат:
new_df
Col1 Col2 Row1 Row2 Value
0 A A 1 1 1
1 A B 1 2 2
2 A C 1 3 3
3 B A 2 1 1
4 B B 2 2 2
5 B C 2 3 3
6 C A 3 1 1
7 C B 3 2 2
8 C C 3 3 3
Комментарии:
1. большое спасибо. это работает. Но, как вы сказали, может быть более изящный метод. Но я действительно ценю ваш ответ. Спасибо