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

2024-04-30 02:41:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用一个API,它返回一个包含嵌套列表的字典,让我们将其命名为coins_best。结果如下所示:

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

列表中的第一个值是时间戳,而第二个值是美元价格。我想创建一个带有价格和时间戳作为索引的数据框。我尝试使用此代码只需一步:

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

这次尝试给了我一个只有一列的数据帧,而不是所需的两列,因为当我尝试使用columns时,使用columns参数会抛出错误(TypeError:Index(…)必须用某种集合调用,'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

您知道如何在创建数据帧之前处理字典以获得此结果吗

这是我的第一个问题,我尽量说清楚。多谢各位

更新#1

{a1}的答案也解决了时间戳的问题,并且对它的用途很有用。但是,示例代码虽然正确(因为它使用了提供的信息),但仅限于这两个键。这是解决字典中每个键问题的最终代码

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

非常感谢你的回答


Tags: columnsindataframedf列表for字典时间
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
)

结果图: plotting bitcoins over time

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

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

相关问题 更多 >