Как мне изменить мой код Python ниже, чтобы добавить символ в начало строки в Pandas? - PullRequest
0 голосов
/ 05 сентября 2018

Я выполняю задание по визуализации данных, в котором мне нужно взять набор данных и выполнить определенные визуализации. Рассмотрим следующее о наборе данных:

  • Столбцы представлены долготой (список строк с прикрепленными к ним буквами 'E' или 'W', обозначающими восточную или западную долготу соответственно)
  • Строки представлены широтой (столбец строк с 'N' или 'S', обозначающими северную или южную широты соответственно)

Таким образом, я должен прочитать набор данных, преобразовать широты с «N», прикрепленными к ним, в положительные значения с плавающей запятой и «S», привязанные к ним, как отрицательные значения с плавающей запятой (все данные представлены в строке).

Точно так же я должен преобразовать долготы с 'E', прикрепленными к ним, в положительные значения с плавающей точкой и 'W', прикрепленные к ним, как отрицательные значения с плавающей точкой.

Поскольку я новичок в Python, Pandas, Numpy, у меня много трудностей, чтобы достичь того же. До сих пор я был в состоянии преобразовать широты и долготы в строковом формате в формат с плавающей запятой и избавиться от символов 'N', 'S', 'E', 'W' соответственно. Однако я не могу понять, как сделать значения с плавающей точкой положительными или отрицательными на основе символов ('N', 'S', 'E', 'W') до преобразования с плавающей точкой.
Ниже приведен код, который я написал до сих пор:

import pandas as pd

df = pd.read_csv("Aug-2016-potential-temperature-180x188.txt", skiprows = range(7))
df.columns = ["longitude"]
df = df.longitude.str.split("\t", expand = True)
smaller = df.iloc[::10,:]

print(df.head(10), end = "\n")
print(smaller, end = "\n")
print(df.iloc[1][3], end = "\n")
print(smaller.iloc[2][175], end = "\n")

import numpy as np
import pandas as pd

data = pd.read_csv('~/documents/datasets/viz_a1/Aug-2016-potential-temperature-180x188.txt', skiprows=7)
data.columns = ['longitudes']
data = data['longitudes'].str.split('\t', expand=True)
df = data.iloc[::10,:]
df.head()

# replace 'E' with '' and 'W' with ''
df.loc[0] = df.loc[0].str.replace('E', '').str.replace('W', '')

# convert the longitude values to float values (THIS ONE WORKS)
df.loc[0] = df.loc[0][1:].astype(float)

# replace 'S' with '' and 'N' with ''
df.loc[:][0] = df.loc[:][0].str.replace('S', '').str.replace('N', '')

# convert latitude values into float values (THIS ONE DOES NOT WORK!!)
df.loc[:][0] = df.loc[:][0].astype(float)

# checking if the float values exist
print(df.loc[0][2], ' data-type ', type(df.loc[0][2])) # columns converted into float
print(df.loc[30][0], ' data-type ', type(df.loc[30][0])) # rows not converted into float  

Сомнения:

  • Как преобразовать значения в положительные и отрицательные значения с плавающей запятой на основе символа («S», «W» представляют значения -ve с плавающей запятой, а «E», «N» представляют положительные значения с плавающей запятой)
  • Как мне успешно преобразовать широты в значения с плавающей точкой (код, который я написал, не преобразовывал строки в числа с плавающей точкой; также не выдавал никакой ошибки!)

P.S. Преобразования для долгот вызвали много предупреждений. Было бы хорошо, если бы кто-то мог объяснить, почему я получаю эти предупреждения и как их предотвратить? (опять же, я новичок в Python и Pandas!)

Набор данных можно найти здесь

Вот скриншот набора данных:
screenshot of the data just after putting it in data-frame

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

Это может быть не самым чистым, но вы можете заменить «N» и «E» на «», а затем использовать np.where для замены «S» и «W», конвертировать в float и умножить на -1

Я сделал пример df, где я применяю эту процедуру к первому столбцу

example = pd.DataFrame({'1':['S35', 'E24', 'N45', 'W66'],
           '2': ['E45', 'N78', 'S12', 'W22']})

example
Out[153]: 
     1    2
0  S35  E45
1  E24  N78
2  N45  S12
3  W66  W22

col = example.loc[:, '1']

col = col.str.replace('N|E', "")

col
Out[156]: 
0    S35
1     24
2     45
3    W66
Name: 1, dtype: object

example.loc[:,'1'] = np.where(col.str.contains('W|S'), col.str.replace('W|S', '').astype('float') * -1, col)


example
Out[158]: 
    1    2
0 -35  E45
1  24  N78
2  45  S12
3 -66  W22
0 голосов
/ 05 сентября 2018

Я бы добавил еще несколько аргументов в функцию read_csv, чтобы получить фрейм данных, в котором столбцы - это продольные строки, а индекс - это широта. Данные в вашем фрейме данных теперь являются растровыми данными

df = pd.read_csv(r'Aug-2016-potential-temperature-180x188.txt',
                 skiprows=8, delimiter='\t', index_col=0)

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

column_series = pd.Series(df.columns)
df.columns = column_series.apply(lambda x: float(x.replace('E','')) if x.endswith('E') else -float(x.replace('W','')))

После того, как я преобразую строки широты, индекс кадра данных, в число с плавающей запятой с этим кодом:

index_series  = pd.Series(df.index)
df.index = index_series.apply(lambda x: float(x.replace('N','')) if x.endswith('N') else -float(x.replace('S','')))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...