我正在提取一个API,该API以以下格式检索数据。
data = ({'2019-12-20': {'SMA': '216.0037'},
'2019-12-19': {'SMA': '215.4711'},
'2019-12-18': {'SMA': '214.9335'},
'2019-12-17': {'SMA': '214.4074'}})
当前,当我尝试运行“ data = pd.DataFrame(data)”时,它将返回一个包含2行的数据框,该行使用每个日期作为一个单独的列,并为每行提供一个字典作为值(以下示例)。
2019-12-20 | 2019-12-19 | 2019-12-18
0 "{ 'SMA' : '216.0037' } | {'SMA': '215.4710"} | {'SMA': '214.9335'}
1 NaN | NaN | NaN
我想弄清楚如何按照以下格式将这些数据转换为数据框。
date | SMA
----------------------------
0 '2019-12-20' | '216.0036'
1 '2019-12-19' | '215.4711'
2 '2019-12-18' | '214.9335'
3 '2019-12-17' | '214.4047'
任何帮助将不胜感激!
答案 0 :(得分:5)
IIUC
pd.DataFrame(data).T.reset_index().rename(columns={'index':'date'})
date SMA
0 2019-12-20 216.0037
1 2019-12-19 215.4711
2 2019-12-18 214.9335
3 2019-12-17 214.4074
或from_dict
pd.DataFrame.from_dict(data,'index').reset_index().rename(columns={'index':'date'})
SMA
2019-12-17 214.4074
2019-12-18 214.9335
2019-12-19 215.4711
2019-12-20 216.0037
答案 1 :(得分:4)
在您的代码中,数据看起来像是一个字典(外括号被忽略了)。
data = ({
'2019-12-20': {'SMA': '216.0037'},
'2019-12-19': {'SMA': '215.4711'},
'2019-12-18': {'SMA': '214.9335'},
'2019-12-17': {'SMA': '214.4074'}
})
assert isinstance(data, dict)
如果是这种情况,则可以如下生成所需的数据框。
pd.DataFrame(
[(k, v['SMA']) for k, v in data.items()],
columns=['date', 'SMA']
)
输出:
date SMA
0 2019-12-20 216.0037
1 2019-12-19 215.4711
2 2019-12-18 214.9335
3 2019-12-17 214.4074
答案 2 :(得分:1)
您将可以使用pandas.DataFrame.T
通过将行写为列将DataFrame反映在其主要对角线上,反之亦然。属性T是该方法的访问器。
df = pd.DataFrame(data).T.reset_index().rename(columns={'index':'date'})
将返回:
date SMA
0 2019-12-20 216.0037
1 2019-12-19 215.4711
2 2019-12-18 214.9335
3 2019-12-17 214.4074