【问题标题】:How to separate pandas elements that contain lists如何分隔包含列表的熊猫元素
【发布时间】:2016-02-05 11:18:23
【问题描述】:

这是一个数据样本。

data['nxt'].head()
​
Out[47]:
market_cap_by_available_supply  price_btc   price_usd   volume_usd
0   [1386136000000, 15091900]   [1386136000000, 1.3982e-05] [1386136000000, 0.0150919]  [1386136000000, 0.0]
1   [1386222394000, 14936300]   [1386222394000, 1.31922e-05]    [1386222394000, 0.0149363]  [1386222394000, 0.0]
2   [1386308781000, 11237100]   [1386308781000, 1.12001e-05]    [1386308781000, 0.0112371]  [1386308781000, 0.0]
3   [1386395502000, 7031430]    [1386395502000, 9.6644e-06] [1386395502000, 0.00703143] [1386395502000, 0.0]
4   [1386481920000, 6292640]    [1386481920000, 8.82299e-06]    [1386481920000, 0.00629264] [1386481920000, 0.0]

我只感兴趣:market_cap_by_available_supply

data['nxt'].market_cap_by_available_supply

0      [1386136000000, 15091900]
1      [1386222394000, 14936300]
2      [1386308781000, 11237100]
3       [1386395502000, 7031430]
4       [1386481920000, 6292640]

这篇文章的目的是:我们如何将它们分成两列:时间戳和市值?

但我的最终目标是(使用下面的代码)

创建一个包含 dashcoin 的市值和时间戳的新数据框,然后依次添加与 DASH 时间戳相对应的其他代币的市值,这方面的任何帮助都会很棒。

import numpy as np
from pandas import Series, DataFrame
import pandas as pd

coins = ['dashcoin','litecoin','dogecoin','nxt']

API = 'https://api.coinmarketcap.com/v1/datapoints/'

data = {}

for coin in coins: 
    data[coin]=(pd.read_json(API + coin))

MC_data = pd.DataFrame(columns=[['Timestamp']+coins])

编辑:

我正在使用 for 循环,因为稍后我将添加许多“硬币”。 @timmy,你提取时间戳和上限的方法效果很好,虽然我无法让合并方法工作。

data2 = {}

for coin in coins:
    #seperates timestamp and marketcap from their respective list inside each element
    TS = data[coin].market_cap_by_available_supply.map(lambda r: r[0])
    cap = data[coin].market_cap_by_available_supply.map(lambda r: r[1])
    #Creates DataFrame and stores timestamp and marketcap data into dictionairy
    df = DataFrame(columns=['timestamp','cap'])
    df.timestamp = TS
    df.cap = cap
    data2[coin] = df

for coin in coins: 

data2['merged'] = data2['merged'].merge(data[coin], on='timestamp', how='outer')


KeyError: 'merged'

【问题讨论】:

  • 我更新了我的答案以解决您最近遇到的问题。问题在于您试图将第一个硬币数据帧与任何内容合并(在循环的第一次迭代中 data2['merged'] 中没有任何内容)

标签: python pandas


【解决方案1】:

关于你的第一个问题,你可以使用地图功能:

# Just renaming for readability
cap_by_supply = data['nxt']['market_cap_by_available_supply']

# Exploding the market_cap_by_available_supply array into 2 columns
data['nxt']['timestamp'] = cap_by_supply.map(lambda r: r[0])
data['nxt']['cap'] = cap_by_supply.map(lambda r: r[1])

关于你的第二个问题,如果我理解得很好:
您可以为每种硬币类型创建一个数据框。它们都应该以相同的方式格式化,具有timestamp 列和cap 列。然后使用merge function 通过时间戳列合并它们。您肯定要删除所有不想合并的列,例如:

# Drop unwanted columns, to repeat for each coin dataframe.
# Here we keep timestamp and cap only, for example.
data['nxt'] = data['nxt'].drop([
    'market_cap_by_available_supply',
    'price_btc',
    'price_usd',
    'volume_usd'
], axis=1)

# Merge all the coin frames into one
data['coins'] = data['dashcoin'].merge(data['litecoin'], on='timestamp', how='outer')
data['coins'] = data['coins'].merge(data['dogecoin'], on='timestamp', how='outer')
data['coins'] = data['coins'].merge(data['nxt'], on='timestamp', how='outer')

您想指定outer 加入,以便保留所有记录。

希望它有所帮助,如果有人更好地理解或有更好的解决方案,我正在接受评论和建议。


编辑关于 OP 的编辑:

在循环的第一次迭代中,data2['merged'] 中没有任何内容,您无法合并没有任何内容的数据框。我们只需要说data2['merged'] 最初只是第一个硬币数据帧的副本。然后我们从第二个数据帧开始循环coins,因为第一个数据帧已经在data2['merged']

...

data2['merged'] = data2[coins[0]]
for coin in coins[1:]: 
    data2['merged'] = data2['merged'].merge(data2[coin], on='timestamp', how='outer')

【讨论】:

  • 这是伟大的人,谢谢,我永远不会想出如何做第一部分,我想知道是否有更简单的方法。无论哪种方式,我都需要研究兰巴。我只是在尝试第二部分
  • 嗯,无法让合并方法工作,我的编辑中的 cmets
  • @Dave990 我在回答中添加了一些关于您的编辑的代码。
猜你喜欢
  • 2022-06-27
  • 1970-01-01
  • 2019-03-06
  • 1970-01-01
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
相关资源
最近更新 更多