Как создать вспомогательный фрейм данных из данного фрейма данных панд? - PullRequest
0 голосов
/ 03 сентября 2018

Я написал код, который читает из данного набора данных и преобразует весь текстовый файл в кадр данных pandas (после некоторой предварительной обработки)

  • Широты представляют строки и присутствуют в списке.
  • Долготы представляют столбцы и представлены в отдельном списке.

Теперь я хочу создать меньший фрейм данных из исходного, который я создал (чтобы было проще понимать и интерпретировать данные) и выполнять вычисления. Для этого я создал столбец меньшего размера размером 18, пропустив каждые 10 элементов. Это работало нормально. Давайте назовем этот новый столбец как new_column.

Теперь я хочу перебрать каждую строку и для каждого значения строки k и new_column j добавить ее в новую матрицу или фрейм данных.
Например, если строка 10 и new_column 12 имеют значение «x», я хочу добавить это «x» в той же позиции, но в новом кадре данных (или матрице).

Я написал следующий код, но я не знаю, как выполнить эту часть, которая позволяет мне делать выше.

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy import interpolate
# open the file for reading
dataset = open("Aug-2016-potential-temperature-180x188.txt", "r+")

# read the file linewise
buffer = dataset.readlines()

# pre-process the data to get the columns
column = buffer[8]
column = column[3 : -1]

# get the longitudes as features
features = column.split("\t")

# convert the features to float data-type
longitude = []

for i in features:
    if "W" in features:
        longitude.append(-float(i[:-1]))   # append -ve sign if "W", drop the "W" symbol
    else:
        longitude.append(float(i[:-1]))    # append +ve sign if "E", drop the "E" symbol

# append the longitude as columns to the dataframe
df = pd.DataFrame(columns = longitude)

# convert the rows into float data-type
latitude = []

for i in buffer[9:]:
    i = i[:-1]
    i = i.split("\t")

    if i[0] != "":
        if "S" in i[0]:     # if the first entry in the row is not null/blank
            latitude.append(-float(i[0][:-1]))  # append it to latitude list; append -ve for for "S"
            df.loc[-float(i[0][:-1])] = i[1:]   # add the row to the data frame; append -ve for "S" and drop the symbol
        else:
            latitude.append(float(i[0][:-1]))
            df.loc[-float(i[0][:-1])] = i[1:]

print(df.head(5))

temp_col = []
temp_row = []
temp_list = []

temp_col = longitude[0 : ((len(longitude) + 1)) : 10]

for iter1 in temp_col:
    for iter2 in latitude:
        print(df.loc[iter2])

Я также предоставляю ссылку на набор данных здесь

(Загрузите файл, заканчивающийся на .txt и запустите код из того же каталога, что и файл .txt)

Я новичок в numpy, pandas и python, и написание этого небольшого куска кода стало для меня огромной задачей. Было бы здорово, если бы я мог получить некоторую помощь в этом отношении.

Ответы [ 2 ]

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

так что, если я вас правильно понял (просто чтобы быть уверенным): у вас есть огромный набор данных с широтой и долготой в виде строк и столбцов. Вы хотите взять суб-образец этого, чтобы иметь дело с этим (вычисление, исследование, и т. д.). Таким образом, вы создаете подсписок строк и хотите создать новый фрейм данных на основе этих строк. Это правильно?

если так:

df['temp_col'] = [ 1 if x%10 == 0 else 0 for x in range(len(longitude))]
new_df = df[df['temp_col']>0].drop(['temp_col'],axis = 1]

и если вы также хотите удалить некоторые столбцы:

keep_columns = df.columns.values[0 :len(df.columns) : 10]
to_be_droped = list(set(df.columns.values) - set(keep_columns))
new_df = new_df.drop(to_be_droped, axis = 1)
0 голосов
/ 03 сентября 2018

Добро пожаловать в мир NumPy / Pandas :) Одна из действительно крутых вещей в этом - способ, которым он абстрагирует действия над матрицей в простые команды, устраняя в подавляющем большинстве случаев любую необходимость писать циклы.

Много вашей тяжелой работы было бы ненужным с большим количеством pandorable кода. Следующее - моя попытка воспроизвести то, что вы сказали. Возможно, меня неправильно поняли, но, надеюсь, это приблизит вас / укажет в правильном направлении. Не стесняйтесь просить разъяснений!

import pandas as pd

df = pd.read_csv('Aug-2016-potential-temperature-180x188.txt', skiprows=range(7))
df.columns=['longitude'] #renaming
df = df.longitude.str.split('\t', expand=True)
smaller = df.iloc[::10,:] # taking every 10th row
df.head()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...