
问题语句要求提取特定日期中的每个小时的特定天气参数,如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
发布于 2018-09-07 02:31:20
我给你写了两个小函数,你可以用它来解压缩数据。
原始数据文件如下所示
import pandas as pd
df = pd.DataFrame(data = temp['data']['weather'])
df.head()
第一个很简单,它使用一个dataframe和一个列的名称,它将将该列提取为一个新的dataframe。
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()
提取的表有时有一个没有用的字典列表,只有一个值,这一事实使我感到不安。当然,您可以使用与上面相同的函数来提取该列作为另一个dataframe,但是接下来您将有一个带有单个列的dataframe,为什么不直接将其解压缩。因此,我编写了另一个函数,通过用单个值解压字典列表来清除提取的数据。
这个版本还需要一个dataframe和一个列名来从中提取数据。但是,从提取的dataframe中,如果一个列包含一个只有一个值的字典列表,它就会解压它。
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()
https://datascience.stackexchange.com/questions/37914
复制相似问题