提问者:小点点

如何从给定数据帧创建子数据帧?


我已经编写了一段代码,从给定的数据集读取数据,并将整个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都是新手,编写这段代码对我来说是一项艰巨的任务。如果我能在这方面得到一些帮助就太好了。


共2个答案

匿名用户

欢迎来到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)