Сдвигая часть строки в Dataframe вправо? - PullRequest
1 голос
/ 09 апреля 2019

Рассматриваемый фрейм данных читает из 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 ]

1 голос
/ 09 апреля 2019

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

В этом случае, если ['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
0 голосов
/ 09 апреля 2019

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

...