我编写了一个代码,该代码从给定的数据集中读取并将整个txt文件转换为熊猫数据帧(经过一些预处理)
现在,我想从我创建的原始数据帧中创建一个较小的数据帧(以便更容易理解和解释数据)并执行计算。为此,我跳过了每10个元素,创建了一个较小的18列。这很好。让我们将此新列称为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])
我还提供了指向数据集here
的链接(下载以.txt结尾的文件,并从与.txt文件相同的目录中运行代码)
我是numpy,pandas和python的新手,编写这小段代码对我来说是一项艰巨的任务。如果能在这方面得到帮助,那将是很棒的。
答案 0 :(得分:1)
欢迎来到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()
答案 1 :(得分:1)
所以,如果我理解您没错(请确保): 您有一个庞大的数据集,其中行和列具有经度和纬度。 您想对此进行抽样处理(计算,探索等)。因此,您将创建一个行的子列表,并希望基于这些行创建一个新的数据框。这是正确的吗?
如果是这样:
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)