Сдвиг части строки в фрейме данных вправо?

Рассматриваемый фрейм данных считывается из файла PDF с помощью Tabula и получает некоторые столбцы в неправильных местах. Это выглядит примерно так:

Index  Name Date  Time  Exp   QT        Comm   Load  Notes
0      VT1  04/16 4:00  Glen  1600      Wheat  NaN   LTA/Book
1      VT2  04/16 4:00  Cof   16000     Wheat  NaN   Split/LTA
2      VT3  Glen  35100 Wheat LTA       NaN    NaN   NaN
3      VT4  Glen  18416 Wheat Split/LTA NaN    Nan   NaN

Я не уверен, почему это получается так, но проблема очевидна в том, что в последних строках этого фрейма данных форматирование больше не читается правильно и начинает игнорировать пустые ячейки и перемещать данные влево. Что я хотел бы сделать, так это переместить строки 2 и 3, чтобы они были правильно ориентированы на столбцы. Конечный результат должен быть:

Index  Name Date  Time  Exp   QT        Comm   Load  Notes
0      VT1  04/16 4:00  Glen  1600      Wheat  NaN   LTA/Book
1      VT2  04/16 4:00  Cof   16000     Wheat  NaN   Split/LTA
2      VT3  NaN   NaN   Glen  35100     Wheat  NaN   LTA      
3      VT4  NaN   NaN   Glen  18416     Wheat  NaN   Split/LTA

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

У вас есть> 2 строки с этой проблемой, верно?

ResidentSleeper 09.04.2019 17:04

да, и полный фрейм данных заметно больше

Edward Gorelik 09.04.2019 17:37

Всегда ли последние три столбца неправильного результата NaN?

ResidentSleeper 09.04.2019 17:50

Да, хотя это немного больше столбцов, чем длина.

Edward Gorelik 09.04.2019 18:02
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
1 382
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Как насчет: df.iloc[2:, 1:] = df.iloc[2:, 1:].shift(2, axis=1)?

Привет! Хотя это может быть ответом на вопрос OP, на SO не рекомендуется отвечать только на код. Добавление некоторого контекста поможет ОП понять, почему этого ответа достаточно, и поможет будущим посетителям сайта. Спасибо!

d_kennetz 09.04.2019 18:08
Ответ принят как подходящий

Я думаю, вам нужно замаскировать все строки, которые соответствуют условию.

При этом если ['Comm', 'Load', 'Notes'] всегда NaN.

mask = df[['Comm', 'Load', 'Notes']].isna().all(axis=1)

Затем используйте .shift и назначьте его обратно фрейму данных.

df.loc[mask, 'Date':'Notes'] = df.loc[mask, 'Date':'Notes'].shift(2, axis=1)

df

   Index Name   Date  Time   Exp     QT   Comm  Load      Notes
0      0  VT1  04/16  4:00  Glen   1600  Wheat   NaN   LTA/Book
1      1  VT2  04/16  4:00   Cof  16000  Wheat   NaN  Split/LTA
2      2  VT3    NaN   NaN  Glen  35100  Wheat   NaN        LTA
3      3  VT4    NaN   NaN  Glen  18416  Wheat   NaN  Split/LTA

поэтому, если бы у меня было больше столбцов, я бы просто добавил больше имен в оператор «mask =», а затем увеличил диапазон в операторе df.loc для столбцов?

Edward Gorelik 09.04.2019 18:17

@EdwardGorelik Да, вы должны сначала замаскировать его, а затем назначить обратно целевым столбцам.

ResidentSleeper 09.04.2019 18:24

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