编码问题 - 从列中提取值并形成新的数据框[编辑]

数据挖掘 Python 数据框
2022-03-12 04:24:41

数据帧图像问题陈述需要在特定日期的每小时提取某些天气参数,如数据框中所示。“每小时”列由每个条目中的 24 个列表组成,表示该特定日期每小时的天气参数。有没有一种方法可以提取所有这些 24 小时的参数“CloudCover”并形成一个新的数据框,其列表示一天中的小时数和单个日期的相应 CloudCover 值?

编辑:根据下面给出的建议,我修改了我的代码并且出现了一个新问题。虽然@jahKnows 建议的代码工作得很好,但它只给出每小时列条目中任何参数的第一个值。例如。在日期 01-01-2016 中,对应的每小时列条目有 24 个 cloudCover 值。但是下面建议的代码只给出了第一个 CloudCover 值,并移至下一个日期,而忽略了该特定日期的其他 23 个 CloudCover 值。你能建议我改变来解决这个问题吗?我在下面附上了更新的笔记本链接和原始数据集链接。

笔记本链接(已编辑):https ://anaconda.org/vishwa989796/okayishtrial/notebook

数据集链接:https ://drive.google.com/drive/folders/1wMNOZapHib9AyYFaLdA1jdEdx9DdLnXx

1个回答

我给你写了两个小函数,你可以用它们来解压数据框。

原始数据框如下所示

import pandas as pd
df = pd.DataFrame(data = temp['data']['weather'])
df.head()

在此处输入图像描述

第一个很简单,它需要一个数据框和一个列的名称,并将该列提取到一个新的数据框中。

def extract_col_as_df(df, column_name):
    data = [datum[0] for datum in df[column_name]]
    df = pd.DataFrame(data = data)
    return df

df_astronomy = extract_col_as_df(df, 'astronomy')
df_astronomy.head()

在此处输入图像描述

df_astronomy = extract_col_as_df(df, 'hourly')
df_astronomy.head()

在此处输入图像描述

提取的表有时有一个无用的字典列表,只有一个值,这一事实困扰着我。当然,您可以使用与上述相同的功能将该列提取为另一个数据框,但是您将拥有一个包含单个列的数据框,为什么不直接将其解压缩到位。因此,我编写了另一个函数,通过解压缩具有单个值的字典列表来清理提取的数据帧。

更好的版本

这个版本还需要一个数据框和一个列名来从中提取一个数据框。但是从提取的数据框中,如果一列包含一个只有一个值的字典列表,它将解包它。

def extract_col_as_df(df, column_name):
    data = [datum[0] for datum in df[column_name]]

    data = []
    for datum in df[column_name]:
        record = {}
        for i in datum[0]:
            # If the entry in the record is comprised of a list with a 
            # dictionary containing a single value then unpack it
            if type(datum[0][i]) is list:
                if len(datum[0][i]) == 1:
                    key_name = list(datum[0][i][0].keys())[0]
                    record.update({i: datum[0][i][0][key_name]})
                else:
                    record.update({i: datum[0][i]})
            else:
                record.update({i: datum[0][i]})
        data.append(record)

    df = pd.DataFrame(data = data)
    return df

df_astronomy = extract_col_as_df(df, 'hourly')
df_astronomy.head()

在此处输入图像描述