#python #pandas #numpy #csv #str-replace
#python #панды #numpy #csv #str-replace
Вопрос:
Ну, почему-то англоязычный экспортер CSV сделал десятичный маркер запятой. Мне нужны эти значения в виде чисел с плавающей запятой или округленных в целых числах. Но я не могу найти способ сделать это, когда маркером является запятая. Я повторил итерацию и заменил все запятые точками, но кажется, что до того, как я это сделаю, некоторые из них уже с точками, и после того, как я это сделаю, те, у которых есть запятые, не заменяются (он перебирает всю матрицу / массив / вещь, и все значения являются строками). Пожалуйста, осветите мои ошибки и раскройте эти тайны или укажите мне лучший способ сделать то, что мне нужно.
Я использую записную книжку jupyter, поэтому следующий код состоит из трех ячеек:
data = pd.read_csv(processed_data_path, header=None)
print(data)
data = pd.DataFrame.to_numpy(data)
print(data)
for row in data:
for cell in row:
cell = cell.replace(",", ".")
print(data)
Это то, что появляется в первой печати:
0 1 2 3 4 5 6 7 8
0 27,4 27,471 27,458 27,478 27,491 27,491 27,523 27,503 27,516
1 27,433 27,433 27,433 27,503 27,491 27,51 27,491 27,503 27,516
2 27,381 27,407 27,4 27,471 27,452 27,458 27,536 27,561 27,497
3 27,413 27,413 27,426 27,439 27,426 27,491 27,51 27,465 27,471
4 27,375 27,388 27,355 27,368 27,458 27,433 27,439 27,433 27,458
.. ... ... ... ... ... ... ... ... ...
475 26,17 26,183 26,176 26,17 26,183 26,196 26,222 26,241 26,261
476 26,17 26,144 26,157 26,183 26,196 26,215 26,222 26,235 26,254
477 26,17 26,144 26,176 26,183 26,196 26,209 26,235 26,248 26,261
478 26,157 26,157 26,176 26,196 26,189 26,209 26,235 26,241 26,261
479 26,105 26,15 26,157 26,183 26,196 26,209 26,228 26,248 26,281
9 ... 630 631 632 633 634 635 636
0 27,536 ... 32,863 32,863 32,912 32,851 32,845 32,832 32,826
1 27,516 ... 32,857 32,881 32,832 32,845 32,839 32,851 32,845
2 27,529 ... 32,851 32,857 32,826 32,857 32,845 32,851 32,839
3 27,51 ... 32,863 32,826 32,82 32,839 32,796 32,79 32,808
4 27,355 ... 32,839 32,814 32,802 32,814 32,783 32,82 32,802
.. ... ... ... ... ... ... ... ... ...
475 26,241 ... 27,31 27,31 27,336 27,349 27,343 27,355 27,317
476 26,254 ... 27,304 27,31 27,33 27,349 27,355 27,355 27,349
477 26,274 ... 27,291 27,323 27,349 27,349 27,381 27,362 27,388
478 26,294 ... 27,297 27,317 27,33 27,349 27,368 27,407 27,4
479 26,3 ... 27,297 27,323 27,336 27,349 27,394 27,394 27,394
637 638 639
0 32,82 32,814 32,888
1 32,826 32,826 32,851
2 32,777 32,82 32,845
3 32,796 32,82 32,808
4 32,808 32,802 32,82
.. ... ... ...
475 27,362 27,33 27,394
476 27,375 27,381 27,368
477 27,394 27,388 27,4
478 27,407 27,4 27,4
479 27,413 27,407 27,4
[480 rows x 640 columns]
Это то, что выходит во второй печати:
[['27.4' '27.471' '27.458' ... '32,82' '32,814' '32,888']
['27.433' '27.433' '27.433' ... '32,826' '32,826' '32,851']
['27.381' '27.407' '27.4' ... '32,777' '32,82' '32,845']
...
['26.17' '26.144' '26.176' ... '27,394' '27,388' '27,4']
['26.157' '26.157' '26.176' ... '27,407' '27,4' '27,4']
['26.105' '26.15' '26.157' ... '27,413' '27,407' '27,4']]
Это то, что выходит в третьей печати:
[['27.4' '27.471' '27.458' ... '32,82' '32,814' '32,888']
['27.433' '27.433' '27.433' ... '32,826' '32,826' '32,851']
['27.381' '27.407' '27.4' ... '32,777' '32,82' '32,845']
...
['26.17' '26.144' '26.176' ... '27,394' '27,388' '27,4']
['26.157' '26.157' '26.176' ... '27,407' '27,4' '27,4']
['26.105' '26.15' '26.157' ... '27,413' '27,407' '27,4']]
Комментарии:
1. Спасибо как blacksite, так и Quang Hoang за ответы, я использовал последнюю строку из последнего, чтобы решить ее, и получил хорошую информацию и советы от первого.
Ответ №1:
Используйте функцию замены Pandas:
data = pd.read_csv(processed_data_path, header=None)
data = data.replace(',','.', regex=True)
Кроме того, рассмотрите десятичную опцию, которая обрабатывает ,
для вас:
data = pd.read_csv(processed_data_path, header=None, decimal=',')
Ответ №2:
for row in data:
for cell in row:
cell = cell.replace(",", ".")
Эти строки изменяют переменную cell
, которая вообще не «привязана» к вашему data
объекту. Вы буквально просто заменяете ,
на .
in некоторую переменную cell
. Вы могли бы сделать что-то вроде этого, которое заменяет все экземпляры ,
with .
pandas.DataFrame
перед преобразованием в NumPy (хотя непонятно, почему вы в первую очередь выбираете базовое представление этих данных в NumPy).
data = pd.read_csv(processed_data_path, header=None)
data = data.replace(',', '.')
Если вы действительно хотите изменить сам объект NumPy таким итеративным способом, вы могли бы сделать что-то вроде этого:
# For each row
for i in range(data.shape[0]):
# For each column
for j in range(data.shape[1]):
data[i, j] = data[i, j].replace(',', '.')
Хотя настоятельно рекомендуется придерживаться «векторизованного» pandas.DataFrame.replace
подхода, показанного выше.
Комментарии:
1. Причина, по которой я переместил его в numpy, заключается в том, что формат pandas оказался менее простым, чем массивы numpy, когда речь идет о доступе к позициям (я получаю «ключевую ошибку», до сих пор не совсем понимаю). Но в любом случае я округлю эти значения и сопоставлю с оттенками серого, чтобы посмотреть, что получится, так что numpy, похоже, подходит и для этого.