#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. Я думаю, что simpledf.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, :]