【发布时间】: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