У меня есть CSV, содержащий некоторые необработанные данные. Я удаляю строки условно, но сталкиваюсь с проблемой, когда процент > 100%. Процент, по-видимому, рассматривается как двузначный %.
Вот моя функция для преобразования этого фрейма данных. Цель состоит в том, чтобы удалить все строки с процентом >= 50% и процентом <0% и процентом == 0% в указанном столбце; затем отсортируйте по убыванию по этому столбцу. Я уверен, что могу комбинировать все преобразования перетаскивания, но мне нравится читабельность этого.
def modify_csv():
df = pd.read_csv("Initial.csv")
# Delete row if utb > 50%
df.drop(df[df["column 1"] >= "50%"].index, inplace = True)
# Delete row if utb == 0%
df.drop(df[df["column 1"] == "0%"].index, inplace = True)
# Delete row if utb == 0%
df.drop(df[df["column 1"] < "0%"].index, inplace = True)
# Sort by column 1
df.sort_values(by = "column 1", ascending = False, inplace = True)
df.to_csv("Final.csv", na_rep = 0, index = False)
Это вывод для моего последнего запуска «столбца 1»:
49%
48%
47%
45%
39%
36%
27%
19%
17%
111%
104%
Все работает отлично, за исключением того, что вы можете видеть, что 111% и 104% обрабатываются так, как будто они равны 11% и 10%, так как мы сортируем по убыванию. Любое понимание будет оценено! Я поискал в Интернете, но не смог найти подобных случаев. Цените помощь!
Причина такого порядка сортировки не в том, что он обрабатывается как двузначный процент, а в том, что данные обрабатываются как строка. Строка сравнивается лексикографически.
Вам нужно будет установить dtype
аргумент при вызове read_csv
, чтобы убедиться, что ваши данные обрабатываются как числа. Вам также может понадобиться использовать converters
, чтобы убрать знак процента.
Перед числовым сравнением преобразуйте числовые строки в числа:
def modify_csv():
df = pd.read_csv("Initial.csv")
df['percent'] = pd.to_numeric(df["column 1"].str.rstrip('%'))
df = df.loc[(df['percent'] < 50) & (df['percent'] > 0)]
df = df.sort_values(by = "percent", ascending=False)
# Instead, you may want to keep the percent column and drop column 1, because numbers are more useful than numeric strings,
# and whoever reads Final.csv may end up needing to strip the % signs again...
df = df.drop('percent', axis=1)
df.to_csv("Final.csv", na_rep=0, index=False)
Спасибо! Подобно первому комментарию с отличным примером. Ценить это.
Большое спасибо Ли. Следующий раздел моей функции преобразовал этот столбец в числовой, чтобы я мог получить среднее значение этого столбца. Я переместил to_numeric перед моим кодом выше, и теперь все работает. Спасибо за помощь.