#python-3.x #pandas #csv
#python-3.x #pandas #csv
Вопрос:
Я начинаю с test.csv, который содержит:
Name,Date,Weight
Jonny,03-08-2019,100
Sally,03-08-2019,120
Bobby,03-08-2019,200
С помощью df = pd.read_csv('test.csv', index_col=None, header='infer')
я загружаю test.csv во фрейм данных, который выдает:
Name Date Weight
0 Jonny 03-08-2019 100
1 Sally 03-08-2019 120
2 Bobby 03-08-2019 200
Затем я создал функцию для удаления строки, выбранной пользователем. Но я делаю это, разделяя фрейм данных в выбранной строке, а затем добавляя 2 фрейма данных обратно вместе. Есть ли более простой способ сделать это? Я посмотрел на df.drop (), но не смог удалить всю строку.
def delete_entry(df):
num_to_delete = int(input("Delete which row? "))
first_rows_to_keep = df.iloc[:num_to_delete]
last_rows_to_keep = df.iloc[num_to_delete 1:]
new_df = first_rows_to_keep.append(last_rows_to_keep)
with open('test.csv', 'w') as f:
new_df.to_csv(f, index=False)
Ищу способы улучшить свой код. Спасибо!
Ответ №1:
Вы можете использовать .drop()
метод pandas df, используя соответствующие аргументы для удаления указанных строк на месте.
Например, чтобы удалить заданную строку:
df.drop(num_to_delete, axis=0, inplace=True)
где второй аргумент (‘axis’) обозначает удаление строк (в отличие от столбцов), а последний аргумент указывает операцию, которая должна быть выполнена на месте.
Вы также могли бы рассмотреть .set_index
метод. Это, например, дало бы вам возможность удалять строки в зависимости от значения данного столбца (т. Е. Удалять все с именем Бобби).
Комментарии:
1. Нет проблем, вы также можете посмотреть на метод .set_index(). Это позволило бы легко удалять строки с определенными значениями.
Ответ №2:
В вашем случае удаление столбцов на основе индекса имеет наибольший смысл.
df.drop(df.index[2])
При этом будет удалена третья строка, содержащая данные о Бобби.
Комментарии:
1. Это приводит к
IndexError: index 2 is out of bounds for axis 0 with size 2
2. Я вижу. Да, это произошло потому, что вы выводите свои заголовки. Мой плохой, пожалуйста, попробуйте с
df.drop(df.index[1])