Фильтровать фрейм данных из блоков данных xlsx, распределенных здесь и там

Я получил 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 в качестве допустимых имен строк.

0
0
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
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' значения для этих колонок (это следующие две строки). Столбцы со значениями создаются в цикле.

Другие вопросы по теме

Как сохранить среднее значение и стандартное отклонение (STD) в CSV-файле pandas
Как динамически объединять несколько столбцов, где имена столбцов хранятся в виде строки с разделителями Pandas
Нарезать фрейм данных с определенным условием
Разделите фрейм данных на основе логического условия, умножьте на константу и присвойте значения обратно фрейму данных. Не работает
Pandas to_csv, но удалите NaN на уровне отдельной ячейки, не удаляя полную строку или столбец
Как я могу преобразовать словарь, содержащий ключ и значение в виде списка, в фрейм данных panda с одним столбцом для ключей и одним столбцом для значений?
Импорт нескольких файлов .cnv, извлечение имени файла и присоединение в виде столбца
Как изменить определенные значения столбца в фрейме данных?
Прочитайте HDF - Работа с иерархией через Pandas
Python, Pandas: часовой пояс Африки/Каира не использует летнее время (DST) в 2023 году