#python #python-3.x #excel #pandas #dataframe
#python #python-3.x #excel #pandas #фрейм данных
Вопрос:
У меня есть данные в четырех столбцах в Excel, которые нужно перенести в две строки. Первый столбец будет строкой заголовка для данных во втором столбце, а третий столбец будет заголовком для данных в четвертом столбце, как показано ниже:
Данные, как показано ниже
A 1 G 7
B 2 H 8
C 3 I 9
D 4 J 10
E 5 K 11
F 6 L 12
И нужно транспонировать
A B C D E F G H I J K L
1 2 3 4 5 6 7 8 9 10 11 12
Ценю ваш ценный вклад.
Ответ №1:
Используйте pd.concat
и transpose(.T)
:
In [2139]: d = pd.concat([df.iloc[:, :2].T.reset_index(drop=True), df.iloc[:, 2:].T.reset_index(drop=True)],1)
In [2144]: d.columns = d.loc[0]
In [2147]: d = d.drop(0)
In [2148]: d
Out[2148]:
0 A B C D E F G H I J K L
1 1 2 3 4 5 6 7 8 9 10 11 12
Комментарии:
1. Спасибо @Mayank Porwal
Ответ №2:
Для общего решения, работающего с 4
, 6
, 10
столбцы выбирают пары и разбивают столбцы на пары путем индексации, сглаживают в массиве numpy и передают в DataFrame
конструктор:
c = df.iloc[:, ::2].T.to_numpy().ravel()
v = df.iloc[:, 1::2].T.to_numpy().ravel()
df = pd.DataFrame([v], columns=c)
print (df)
A B C D E F G H I J K L
0 1 2 3 4 5 6 7 8 9 10 11 12
Или, если вы хотите использовать решение pandas, создайте MultiIndex
его путем деления по модулю и целому np.arange
числу на длину столбцов, а затем измените на DataFrame.stack
, затем транспонируйте и очистите некоторые данные:
a = np.arange(len(df.columns))
df.columns = [a % 2, a // 2]
df = (df.stack()
.sort_index(level=1)
.set_index(0)[[1]]
.T
.rename_axis(None, axis=1)
.reset_index(drop=True))
print (df)
A B C D E F G H I J K L
0 1 2 3 4 5 6 7 8 9 10 11 12
Ответ №3:
Вы можете использовать np.reshape
, np.vstack
, а затем set_index
и Transpose
:
>>> pd.DataFrame(np.vstack(np.split(df, 2, axis=1))).set_index(0).T
0 A B C D E F G H I J K L
1 1 2 3 4 5 6 7 8 9 10 11 12
Комментарии:
1. Потрясающе. Это замечательно. Я попробовал все три решения. Я новичок в python и программировании в целом. Это был мой первый вопрос здесь, и я получил очень хороший ответ. Спасибо, @Sayandip Dutta
2. @ArifKassim добро пожаловать. В SO, если вы зададите достойный вопрос, вы почти всегда получите помощь. Если это сработает, вы можете рассмотреть возможность голосования.