微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

仅获取字典中嵌套列表的一个值以创建数据框更新#1

如何解决仅获取字典中嵌套列表的一个值以创建数据框更新#1

我正在使用一个API,该API返回一个带有嵌套列表的字典,将其命名为coins_best,结果看起来像这样:

{'bitcoin': [[1603782192402,13089.646908288987],[1603865643028,13712.070136258053]],'ethereum': [[1603782053064,393.6741989091851],[1603865024078,404.86117057956386]]}

列表中的第一个值为时间戳,第二个为美元价格。我想创建一个具有价格并将时间戳记作为索引的DataFrame。我尝试使用此代码仅一步完成它:

d = pd.DataFrame()
for id,obj in coins_best.items():
    for i in range(0,len(obj)):
        temp = pd.DataFrame({
            obj[i][1]
            }
        )
        d = pd.concat([d,temp])
d

这种尝试给了我一个只有一列而不是两列的DataFrame,因为使用columns参数会引发错误(必须使用某种类型的集合来调用TypeError:Index(...),“我尝试使用id

时通过了bitcoin'

然后,我尝试着对字典及其列表进行预处理:

for k in coins_best.keys():
    inner_lists = (coins_best[k] for inner_dict in coins_best.values())

items = (item[1] for ls in inner_lists for item in ls)

我无法同时获得字典中的两个元素,只是最后一个

我知道可以尝试:

df = pd.DataFrame(coins_best,columns=coins_best.keys())

哪个给我:

                 bitcoin                              ethereum
0   [1603782192402,13089.646908288987] [1603782053064,393.6741989091851]
1   [1603785693143,13146.275972229188] [1603785731599,394.6174435303511]

然后尝试删除每行的每个列表中的第一个元素,但是对我来说更难。所需的答案是:

                      bitcoin            ethereum
1603782192402   13089.646908288987   393.6741989091851
1603785693143   13146.275972229188   394.6174435303511

您知道如何在创建DataFrame之前处理字典以获取此结果吗?

这是我的第一个问题,我试图尽可能清楚。非常感谢。

更新#1

Sander van den Oord的回答也解决了时间戳问题,对于解决此问题很有用。但是,示例代码正确无误(因为它使用了提供的信息)仅限于这两个键。这是解决字典中每个键问题的最终代码

for k in coins_best:
    df_coins1 = pd.DataFrame(data=coins_best[k],columns=['timestamp',k])
    df_coins1['timestamp'] = pd.to_datetime(df_coins1['timestamp'],unit='ms')
    df_coins = pd.concat([df_coins1,df_coins],sort=False)

df_coins_resampled = df_coins.set_index('timestamp').resample('d').mean()

非常感谢您的回答。

解决方法

我认为您不应该忽略在不同时间获取硬币价值的事实。您可以执行以下操作:

import pandas as pd
import hvplot.pandas

coins_best = {
    'bitcoin': [[1603782192402,13089.646908288987],[1603865643028,13712.070136258053]],'ethereum': [[1603782053064,393.6741989091851],[1603865024078,404.86117057956386]],}

df_bitcoin = pd.DataFrame(data=coins_best['bitcoin'],columns=['timestamp','bitcoin'])
df_bitcoin['timestamp'] = pd.to_datetime(df_bitcoin['timestamp'],unit='ms')


df_ethereum = pd.DataFrame(data=coins_best['ethereum'],'ethereum'])
df_ethereum['timestamp'] = pd.to_datetime(df_ethereum['timestamp'],unit='ms')

df_coins = pd.concat([df_ethereum,df_bitcoin],sort=False)

您的df_coins现在看起来像这样:

+----+----------------------------+------------+-----------+
|    | timestamp                  |   ethereum |   bitcoin |
|----+----------------------------+------------+-----------|
|  0 | 2020-10-27 07:00:53.064000 |    393.674 |     nan   |
|  1 | 2020-10-28 06:03:44.078000 |    404.861 |     nan   |
|  0 | 2020-10-27 07:03:12.402000 |    nan     |   13089.6 |
|  1 | 2020-10-28 06:14:03.028000 |    nan     |   13712.1 |
+----+----------------------------+------------+-----------+

现在,如果您希望值位于同一行,则可以使用resampling,这里我每天都这样做:硬币类型在同一天的所有值均取平均值:

df_coins_resampled = df_coins.set_index('timestamp').resample('d').mean()

df_coins_resampled如下所示:

+---------------------+------------+-----------+
| timestamp           |   ethereum |   bitcoin |
|---------------------+------------+-----------|
| 2020-10-27 00:00:00 |    393.674 |   13089.6 |
| 2020-10-28 00:00:00 |    404.861 |   13712.1 |
+---------------------+------------+-----------+

我喜欢使用hvplot来获得结果的交互式图:

df_coins_resampled.hvplot.scatter(
    x='timestamp',y=['bitcoin','ethereum'],s=20,padding=0.1
)

结果图: plotting bitcoins over time

,

时间戳不同,因此正确的输出与您呈现的外观不同,但除此之外,它的一个单行(其中d是您的输入字典):

def register(request):
    form = Clientsform()
    if request.method == 'POST':
        form = Clientsform(request.POST)
        if form.is_valid():
            form.save()
            user = form.cleaned_data.get('name')
            messages.success(request,'Account was created for ' + user)
            return redirect('login')

    context = {'form': form}
    return render(request,"form.html",context)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。