将数据框中的行的一部分向右移动?

时间:2019-04-09 14:41:57

标签: python pandas tabula

有问题的数据框正在使用Tabula从pdf文件中读取,并在错误的位置获取了一些列。看起来像这样:

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 个答案:

答案 0 :(得分:1)

我认为您必须屏蔽所有符合条件的行。

在这种情况下,如果['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

答案 1 :(得分:0)

怎么样:df.iloc[2:, 1:] = df.iloc[2:, 1:].shift(2, axis=1)