Replace () не влияет на элементы итерации массива numpy

#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, похоже, подходит и для этого.