Добавить пустые строки в каждую определенную строку в мультииндексном фрейме данных

У меня есть такой фрейм данных

probe_names  PLAGL1  GRB10  MEST   H19  KCNQ1OT1  MEG3  MEG8  SNRPN  PEG3  \
Jemima   0     0.55   0.53  0.53  0.47      0.62  0.11  0.83   0.50  0.49   
        1     0.51   0.46  0.53  0.52      0.47  0.00  0.91   0.47  0.54   
        2      NaN    NaN   NaN  0.55       NaN   NaN   NaN    NaN  0.50   
        0     0.54   0.59  0.53  0.47      0.66  0.13  0.90   0.51  0.53   
        1     0.48   0.45  0.54  0.50      0.47  0.00  0.90   0.50  0.53   
        2      NaN    NaN   NaN  0.54       NaN   NaN   NaN    NaN  0.53   
Elena    0     0.54   0.55  0.55  0.57      0.53  0.58  0.55   0.52  0.45   
        1     0.53   0.49  0.53  0.65      0.38  0.62  0.48   0.49  0.55   
        2      NaN    NaN   NaN  0.66       NaN   NaN   NaN    NaN  0.42   
        0     0.51   0.53  0.55  0.62      0.52  0.57  0.53   0.50  0.48   
        1     0.48   0.45  0.52  0.63      0.38  0.59  0.46   0.53  0.55   
        2      NaN    NaN   NaN  0.63       NaN   NaN   NaN    NaN  0.45

И я хочу добавить 2 пустых/NaN строки каждые 3 строки

probe_names  PLAGL1  GRB10  MEST   H19  KCNQ1OT1  MEG3  MEG8  SNRPN  PEG3  \
Jemima   0     0.55   0.53  0.53  0.47      0.62  0.11  0.83   0.50  0.49   
        1     0.51   0.46  0.53  0.52      0.47  0.00  0.91   0.47  0.54   
        2      NaN    NaN   NaN  0.55       NaN   NaN   NaN    NaN  0.50  
        3
        4
        0     0.54   0.59  0.53  0.47      0.66  0.13  0.90   0.51  0.53   
        1     0.48   0.45  0.54  0.50      0.47  0.00  0.90   0.50  0.53   
        2      NaN    NaN   NaN  0.54       NaN   NaN   NaN    NaN  0.53   
        3
        4
Elena    0     0.54   0.55  0.55  0.57      0.53  0.58  0.55   0.52  0.45   
        1     0.53   0.49  0.53  0.65      0.38  0.62  0.48   0.49  0.55   
        2      NaN    NaN   NaN  0.66       NaN   NaN   NaN    NaN  0.42   
        0     0.51   0.53  0.55  0.62      0.52  0.57  0.53   0.50  0.48   
        1     0.48   0.45  0.52  0.63      0.38  0.59  0.46   0.53  0.55   
        2      NaN    NaN   NaN  0.63       NaN   NaN   NaN    NaN  0.45
        3
        4

Я не знаю, как это сделать в многоиндексных таблицах. Я проверил в Интернете, но я не могу найти что-то действительно похожее.

Можете ли вы предоставить конструктор для вашего фрейма данных с помощью df.to_dict()?

not_speshal 05.05.2022 17:56
docs.google.com/document/d/…
Monkiky 05.05.2022 18:04

Пожалуйста, включите этот словарь в свой пост. Не ссылайтесь на внешние сайты.

not_speshal 05.05.2022 18:07

Я не могу. Это говорит слишком много кода

Monkiky 05.05.2022 18:08
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
4
43
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

reindex в мультииндекс:

#include an extra index level to differentiate between duplicated indices
df = df.set_index(df.groupby(level=[0,1],sort=False).cumcount(),append=True)

#create a 3-level multiindex
midx = pd.MultiIndex.from_product([df.index.levels[0],range(df.index.levels[1].max()+3),df.index.levels[2]])

#reindex, sort, and drop the extra level
output = df.reindex(midx).sort_index(level=[0,2],ascending=[False,True]).droplevel(2)

>>> output
          PLAGL1  GRB10  MEST   H19  KCNQ1OT1  MEG3  MEG8  SNRPN  PEG3
Jemima 0    0.55   0.53  0.53  0.47      0.62  0.11  0.83   0.50  0.49
       1    0.51   0.46  0.53  0.52      0.47  0.00  0.91   0.47  0.54
       2     NaN    NaN   NaN  0.55       NaN   NaN   NaN    NaN  0.50
       3     NaN    NaN   NaN   NaN       NaN   NaN   NaN    NaN   NaN
       4     NaN    NaN   NaN   NaN       NaN   NaN   NaN    NaN   NaN
       0    0.54   0.59  0.53  0.47      0.66  0.13  0.90   0.51  0.53
       1    0.48   0.45  0.54  0.50      0.47  0.00  0.90   0.50  0.53
       2     NaN    NaN   NaN  0.54       NaN   NaN   NaN    NaN  0.53
       3     NaN    NaN   NaN   NaN       NaN   NaN   NaN    NaN   NaN
       4     NaN    NaN   NaN   NaN       NaN   NaN   NaN    NaN   NaN
Elena  0    0.54   0.55  0.55  0.57      0.53  0.58  0.55   0.52  0.45
       1    0.53   0.49  0.53  0.65      0.38  0.62  0.48   0.49  0.55
       2     NaN    NaN   NaN  0.66       NaN   NaN   NaN    NaN  0.42
       3     NaN    NaN   NaN   NaN       NaN   NaN   NaN    NaN   NaN
       4     NaN    NaN   NaN   NaN       NaN   NaN   NaN    NaN   NaN
       0    0.51   0.53  0.55  0.62      0.52  0.57  0.53   0.50  0.48
       1    0.48   0.45  0.52  0.63      0.38  0.59  0.46   0.53  0.55
       2     NaN    NaN   NaN  0.63       NaN   NaN   NaN    NaN  0.45
       3     NaN    NaN   NaN   NaN       NaN   NaN   NaN    NaN   NaN
       4     NaN    NaN   NaN   NaN       NaN   NaN   NaN    NaN   NaN

ValueError: невозможно обработать неуникальный мультииндекс! во второй строке вашего кода

Monkiky 05.05.2022 18:29

может ли это быть проблема с версией pandas?

Monkiky 05.05.2022 18:34

Используете ли вы другие данные, чем в вашей выборке? Если да, предоставьте образец, который вызывает указанную вами ошибку. Для справки: у меня панды 1.4.2, но я сомневаюсь, что проблема в этом.

not_speshal 05.05.2022 18:42

Нет. Я использую те же данные, что и диктофон. Как вы конвертируете dict в фрейм данных pandas

Monkiky 05.05.2022 19:58
pd.DataFrame(dictionary)?
not_speshal 05.05.2022 19:58

Я преобразовал фрейм данных в dict (с кодом, который вы мне передали), а затем из словаря в новый фрейм данных pandas. С этим новым (и теоретически равным фреймом данных) я запустил код, который вы предлагаете в ответе, и он сработал. Так или иначе, исходный фрейм данных и тот, который был создан из словаря, не совпадают.

Monkiky 05.05.2022 20:12

Кроме того, если вы прочитаете свое решение, половина данных отсутствует. Например, Джемайма в столбце PLAGL1 содержит 4 значения на входе (0,55,0,51,0,54,0,48). Однако в вашем выводе я могу прочитать только два последних значения.

Monkiky 05.05.2022 20:22

Я поместил картинку в документ Word с выводом, и она идентична той, что вы показываете. Если вы видите мой желаемый результат, это должно быть 10 строк на человека.

Monkiky 05.05.2022 20:28

@Monkiky - я смог воспроизвести ваши данные. Смотрите отредактированный ответ. Это должно сработать.

not_speshal 05.05.2022 20:52

Интересно, вы правы. если я выполню my_dict = data_no_control_patient.to_dict(), половина данных исчезнет. Однако я уверен, что data_no_control_patient в комплекте. Что происходит?

Monkiky 05.05.2022 20:58

Это потому, что ваши индексы дублируются, а словарь не может иметь повторяющихся индексов. Вы пробовали отредактированный ответ?

not_speshal 05.05.2022 20:59

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