Pandas read_csv удаляет все строки после EOF

#python #pandas

#питон #панды #python

Вопрос:

Я считываю CSV-файлы в pandas с помощью обычного pd.read_csv. все работает нормально. однако большинство моих CSV-файлов имеют строку в конце, которая имеет «#EOD» в качестве значения первого столбца для обозначения последней строки этой таблицы. после этого может быть больше строк со всеми значениями «nan».

 pd.read_csv('test.csv')

Out[1]: 
     A    B      C   D
0   C1    A    0.5   9
1   C2    A    0.2   1
2   C3    A    0.3   7
3   C4    B    0.2   4
4   #EOD  None nan   nan
5   *     None nan   nan
  

как я могу удалить все строки после строки «#EOD» и включая ее при чтении в csv? Я не знаю, только ли это 1 строка или несколько строк после «#EOD», это может отличаться от файла к файлу.

Комментарии:

1. Есть ли у вас другие nan значения в файлах CSV. Я думаю, что simple df.dropna(inplace=True) должен работать, потому что в строке, содержащей nan , есть / будут #EOD значения..

2. да, может быть много значений nan, поэтому, к сожалению, это не работает

Ответ №1:

Попробуйте это — сначала найдите индекс «# EOD», а затем разрежьте.

 df[:(df.query("A=='#EOD'")).index.item()]
    A  B    C    D
0  C1  A  0.5  9.0
1  C2  A  0.2  1.0
2  C3  A  0.3  7.0
3  C4  B  0.2  4.0
  

Или используйте iloc для общих

 df[: df[df.iloc[:,0]=="#EOD"].index[0]]
  

Комментарии:

1. Спасибо. я искал еще более общий способ, поскольку имя первого столбца может отличаться. есть какие-нибудь идеи?

Ответ №2:

Получите индекс последней нужной строки и используйте его в срезе. ( .loc фрагменты включают конечную метку, в отличие от python list-slicing)

 idx = df.loc[df.iloc[:, 0].shift(-1).eq('#EOD')].index[0]
df.loc[:idx, :]
  

Комментарии:

1. Спасибо. я искал еще более общий способ, поскольку имя первого столбца может отличаться. есть идеи?

2. @RichieV Используйте iloc вместо loc , чтобы вы могли избежать shift этого — df.iloc[:idx, :]