Рассматриваемый фрейм данных считывается из файла 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
Я не могу придумать способ сделать это, который не включает в себя что-то слишком сложное и неэффективное.
да, и полный фрейм данных заметно больше
Всегда ли последние три столбца неправильного результата NaN?
Да, хотя это немного больше столбцов, чем длина.
Как насчет: df.iloc[2:, 1:] = df.iloc[2:, 1:].shift(2, axis=1)
?
Привет! Хотя это может быть ответом на вопрос OP, на SO не рекомендуется отвечать только на код. Добавление некоторого контекста поможет ОП понять, почему этого ответа достаточно, и поможет будущим посетителям сайта. Спасибо!
Я думаю, вам нужно замаскировать все строки, которые соответствуют условию.
При этом если ['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 для столбцов?
@EdwardGorelik Да, вы должны сначала замаскировать его, а затем назначить обратно целевым столбцам.
У вас есть> 2 строки с этой проблемой, верно?