我给你写了两个小函数,你可以用它们来解压数据框。
原始数据框如下所示
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()
