У меня есть файл .csv с двумя столбцами, содержащий такие числа, как:

20 12 24.2312, 12 12 23.312

12 15 26,123, 52 12 12,772

...

...

И т.п.

Я хочу преобразовать эти значения с помощью функции

data=pd.read_csv("test2.csv")

def deg(s): #takes H:M:S, returns S
  c = str(s).split()
  # 0: hour, 1: min, 2: sec
  v = float(c[0]) + float(c[1])/60 + float(c[2])/3600 #convert all to H
  return v*15 #convert to rad"""

for obj in range(len(data)):
    rss=(deg(obj[0]),deg(obj[1]))
    degres.append(rss)

Однако я получаю сообщение об ошибке «объект int не подлежит подписке». Как я могу делать то, что хочу?

0
Ege Tunç 4 Фев 2022 в 13:05

2 ответа

Лучший ответ

Во-первых, поскольку вы показали, что данные не содержат заголовка, вы должны сказать это read_csv:

data=pd.read_csv("test2.csv", header=None)

Далее, поскольку вы хотите применить одну и ту же скалярную функцию ко всем ячейкам вашего фрейма данных, простой способ — преобразовать ее столбец за столбцом с помощью методов pandas:

result = data.transform(lambda s: s.transform(deg))

Из ваших данных примера это дает

            0           1
0  303.100963  183.097133
1  183.858846  783.053217
0
Serge Ballesta 4 Фев 2022 в 13:31
О, это проще и красивее, чем то, что я пробовал, и работает хорошо. Спасибо
 – 
Ege Tunç
4 Фев 2022 в 13:46

В вашем случае obj на самом деле является целым числом: 0, 1, .... Чтобы получить доступ к числам из ячеек, вам нужно сделать так.

import pandas as pd

data=pd.read_csv("test2.csv", header = None)
print(data)

def deg(s): #takes H:M:S, returns S
  c = str(s).split()
  # 0: hour, 1: min, 2: sec
  v = float(c[0]) + float(c[1])/60 + float(c[2])/3600 #convert all to H
  return v*15 #convert to rad"""

degres = []

for i in range(len(data)):
    obj = data[i]
    rss=(deg(obj[0]),deg(obj[1]))
    degres.append(rss)

print(degres)

Скорее всего, есть другие способы написать его в стиле pandas/dataframe.

0
Marcel Preda 4 Фев 2022 в 13:17