首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编码问题-从列中提取值并形成新的数据帧[编辑]

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

Data Science用户
提问于 2018-09-07 01:07:58
回答 1查看 2.8K关注 0票数 1

问题语句要求提取特定日期中的每个小时的特定天气参数,如dataframe中所示。列“每小时”由每个条目中的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

EN

回答 1

Data Science用户

回答已采纳

发布于 2018-09-07 02:31:20

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

原始数据文件如下所示

代码语言:javascript
复制
import pandas as pd
df = pd.DataFrame(data = temp['data']['weather'])
df.head()

第一个很简单,它使用一个dataframe和一个列的名称,它将将该列提取为一个新的dataframe。

代码语言:javascript
复制
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()
代码语言:javascript
复制
df_astronomy = extract_col_as_df(df, 'hourly')
df_astronomy.head()

提取的表有时有一个没有用的字典列表,只有一个值,这一事实使我感到不安。当然,您可以使用与上面相同的函数来提取该列作为另一个dataframe,但是接下来您将有一个带有单个列的dataframe,为什么不直接将其解压缩。因此,我编写了另一个函数,通过用单个值解压字典列表来清除提取的数据。

一个更好的版本

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

代码语言:javascript
复制
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()
票数 1
EN
页面原文内容由Data Science提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://datascience.stackexchange.com/questions/37914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档