如何分离包含列表的pandas元素

时间:2016-02-05 11:18:24

标签: python pandas

以下是数据样本。

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]

这篇文章的目的是:我们如何将这些分为两列:Timestamp和Marketcap?

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

为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'

1 个答案:

答案 0 :(得分:0)

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

# 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')