Я получил xlsx, содержащий данные, распространяемые здесь и там. Я не хочу его редактировать, но обрабатываю пандами.
В приведенном ниже примере мы используем шаблон (rel-xxx) в качестве имени столбца и следующие 2 строки данных в качестве допустимых значений, одна и та же строка или одни и те же столбцы могут содержать несколько допустимых блоков данных.
например
import pandas as pd
data1 = [
["case1","rel-01","y2","rel-02","y4"],
["cas2",0,2,3,3],
["case3",1,3,5,7],
["case4","rel-03","y4","y5","y6"],
["case5",2,4,5,0],
["case6",0,1,2,3],
["case7","y1","y2","rel-04","y4"],
["case8",0,2,4,3],
["case9",2,3,4,5],
]
df1 = pd.DataFrame(data1,columns=['C1','C2','C3','C4','C5'])
print(df1)
ожидаемый результат:
C1 C2 C3 C4 C5
0 case1 rel-01 y2 rel-02 y4
1 cas2 0 2 3 3
2 case3 1 3 5 7
3 case4 rel-03 y4 y5 y6
4 case5 2 4 5 0
5 case6 0 1 2 3
6 case7 y1 y2 rel-04 y4
7 case8 0 2 4 3
8 case9 2 3 4 5
: C1 rel-01 rel-02 rel-03 rel-04
: 0 case1 0 3 2 4
: 0 case2 1 5 0 4
Узел: casexx отличается, поэтому просто используйте case1 и case2 в качестве допустимых имен строк.
import pandas as pd
df = pd.DataFrame(data1, columns=['C1', 'C2', 'C3', 'C4', 'C5'])
df1 = pd.melt(df, id_vars=['C1'], value_vars=['C2', 'C3', 'C4', 'C5'])
ind = df1['value'].str.split('rel-').str[1].dropna().sort_values().index
col = df1.loc[ind, 'value']
aaa = [df1.loc[i + 1:i + 2, 'value'].values for i in col.index]
df2 = pd.DataFrame({'C1': ['case1', 'case2']})
for i in range(len(col)):
df2[col.values[i]] = aaa[i]
print(df2)
Выход
C1 rel-01 rel-02 rel-03 rel-04
0 case1 0 3 2 4
1 case2 1 5 0 4
Здесь с помощью pd.melt строки столбцов «C2», «C3», «C4», «C5» расширяются в один столбец. В 'ind' через str.split('rel-') строки разбиваются там, где они есть. Берется цифра и сортируется, удаляя пустые значения. И в конце получаются индексы этих строк. В 'col' получаем имена будущих колонок, а в 'aaa' значения для этих колонок (это следующие две строки). Столбцы со значениями создаются в цикле.