仅获取字典中嵌套列表的一个值以创建 Dataframe 更新 #1
Get just one value of a nested list inside a dictionary to create a Dataframe Update #1
我正在使用 API,其中 returns 是一个内部有嵌套列表的字典,我们将其命名为 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()
非常感谢您的回答。
我认为您不应该忽视硬币的价值是在不同时间获取的事实。你可以这样做:
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
)
结果图:
有不同的时间戳,因此正确的输出看起来与您提供的不同,但除此之外,它是一个单行文本(其中 d 是您的输入字典):
pd.concat([pd.DataFrame(val, columns=['timestamp', key]).set_index('timestamp') for key, val in d.items()], axis=1)
我正在使用 API,其中 returns 是一个内部有嵌套列表的字典,我们将其命名为 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()
非常感谢您的回答。
我认为您不应该忽视硬币的价值是在不同时间获取的事实。你可以这样做:
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
)
结果图:
有不同的时间戳,因此正确的输出看起来与您提供的不同,但除此之外,它是一个单行文本(其中 d 是您的输入字典):
pd.concat([pd.DataFrame(val, columns=['timestamp', key]).set_index('timestamp') for key, val in d.items()], axis=1)