我已经编写了一段代码,从给定的数据集读取数据,并将整个txt文件转换为熊猫数据帧(经过一些预处理)
现在,我想从我创建的原始数据帧中创建一个更小的数据帧(以便更容易理解和解释数据)并执行计算。为此,我通过跳过每10个元素创建了一个大小为18的较小列。这工作得很好。让我们将这个新列称为new_column。
现在,我要做的是迭代每一行,对于行k和新的_列j的每一个值,将其添加到一个新的矩阵或数据帧中
例如,如果第10行和新的第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都是新手,编写这段代码对我来说是一项艰巨的任务。如果我能在这方面得到一些帮助就太好了。
欢迎来到NumPy/Pandas的世界:)它最酷的地方之一是它将矩阵上的动作抽象为简单的命令,在绝大多数情况下不需要编写循环。
如果代码更为潘多拉,那么您的很多努力工作都是不必要的。以下是我试图重现你所说的话。我可能误解了,但希望它能让你更接近/指引你正确的方向。请随时要求澄清!
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()
所以,如果我理解正确的话(只是为了确定):您有一个巨大的数据集,其中纬度和经度为行和列。您需要对此进行子示例处理(计算、探索等)。因此,您创建了行的子列表,并希望基于这些行创建新的数据帧。这是正确的吗?
如果是这样:
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)