【问题标题】:Get just one value of a nested list inside a dictionary to create a Dataframe Update #1仅获取字典内嵌套列表的一个值以创建 Dataframe Update #1
【发布时间】:2021-02-13 02:19:12
【问题描述】:

我正在使用一个 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(...) must be called with a collection of some kind, 'bitcoin'已通过)当我尝试使用id

然后我尝试使用推导来预处理字典及其列表:

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()

非常感谢您的回答。

【问题讨论】:

  • 为什么你选择1603782192402而不是1603782053064作为预期输出的第一个索引?
  • 每种货币的日期不匹配。您是要忽略日期而只使用比特币的日期,还是要添加更多行以准确获取每个日期的值?
  • 你说得对,索引不匹配。正如@jlb_gouveia 所说,我只想采用比特币指数。感谢您的观察,我真的忘记了这个问题。
  • 嗨crackerfrank,如果你喜欢我的回答,请接受结果。
  • 我很喜欢这个答案,接受了答案。

标签: python pandas dataframe list-comprehension dictionary-comprehension


【解决方案1】:

有不同的时间戳,因此正确的输出看起来与您提供的不同,但除此之外,它是一个单行器(其中 d 是您的输入字典):

pd.concat([pd.DataFrame(val, columns=['timestamp', key]).set_index('timestamp') for key, val in d.items()], axis=1)

【讨论】:

    【解决方案2】:

    我认为你不应该忽视硬币的价值是在不同时间获取的事实。你可以这样做:

    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'], columns=['timestamp', '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
    )
    

    结果图:

    【讨论】:

      猜你喜欢
      • 2017-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-31
      • 2020-10-09
      • 2021-05-10
      • 1970-01-01
      相关资源
      最近更新 更多