randyfirst
@randyfirst (吉野 諒)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

【質問です】Pandas 文字列から特定の文字列を抽出してデータフレームに格納する方法

解決したいこと

coingeckoという仮想通貨関連サイトのAPIより以下のデータを抽出しました。Capture1.JPG

しかしながら、複数の情報が一つの文字列にまとまっているため、データを整理したいと考えております。具体的には、prices列のデータを二つに分け、データフレームへ新しいカラムとして追加したいです。

prices列の0行目のデータ[1630540910867, 22.60606751389419]を例にとって、1630540910867をカラム名Unixtimeとして、22.60606751389419をカラム名pricesとしてデータを整形したいです。

発生している問題・エラー

実際に、以下の方法でデータ抽出を試みましたが、文字がNaNとなってしまいます。
どうすれば数字として表示されるのでしょうか。ご教示よろしくお願いいたします。
extract NaN.JPG

出ているエラーメッセージを入力
NameError (uninitialized constant World)

Capture.JPG

該当するソースコード

言語名 #pandas #python
ソースコードを入力
import requests
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

URL='https://api.coingecko.com/api/v3/coins/wing-finance/market_chart/range'

params={
'id':'wing-finance',
'vs_currency':'usd',
'from': '1630540799',
'to':'1638316799'
}

res=requests.get(URL, params)
result=res.json()
df=pd.DataFrame(result)

df['Unixtime']=df['prices'].str.extract('(163\d{10})',expand=True)

自分で試したこと

ここに問題・エラーに対して試したことを記載してください。

0

2Answer

データフレームの整形を考えるのではなく、データフレームの作成方法を工夫したほうが良いと思います。

pd.DataFrame(result['prices'], columns=['Unixtime', 'prices'])

応用して、

>>> pd.concat({k: pd.DataFrame(v, columns=['Unixtime', 'value']) for k, v in result.items()}, axis=1)
             prices               market_caps                total_volumes
           Unixtime      value       Unixtime         value       Unixtime         value
0     1630540910867  22.606068  1630540910867  4.304046e+07  1630540910867  5.109609e+06
1     1630544571917  22.841263  1630544571917  4.346837e+07  1630544571917  5.246860e+06
2     1630548156040  22.836190  1630548156040  4.374003e+07  1630548156040  5.298659e+06
...             ...        ...            ...           ...            ...           ...
2157  1638307672517  19.228360  1638307672517  4.114132e+07  1638307672517  3.203761e+06
2158  1638311298498  19.078590  1638311298498  4.074523e+07  1638311298498  3.107807e+06
2159  1638314918789  19.177981  1638314918789  4.097285e+07  1638314918789  3.081039e+06

[2160 rows x 6 columns]
1Like

Comments

  1. @randyfirst

    Questioner

    貴重なアドバイスありがとうございます。
    解決いたしました。

image.png
文字列ではなくlistとしてデータを持っているようなので、インデックスを指定してあげるだけでとってこれそうです。

df['Unixtime']=df['prices'].map(lambda x:x[0])
df['price']=df['prices'].map(lambda x:x[1])

image.png

0Like

Comments

  1. @randyfirst

    Questioner

    貴重なアドバイスありがとうございます。
    解決いたしました。

Your answer might help someone💌