質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

746閲覧

APIでJsonを取得し、任意条件でpandasへ変換後、csvと結合した後に各行に取得日付を任意の列に追加できない

msy47

総合スコア26

AWS Lambda

AWS Lambdaは、クラウド上でアプリを実行できるコンピューティングサービス。サーバーのプロビジョニングや管理を要せず複数のイベントに対してコードを実行します。カスタムロジック用いた他AWSサービスの拡張やAWSの規模やパフォーマンスを用いたバックエンドサービスを作成できます。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Cisco

シスコ(Cisco Systems,Inc.)は、アメリカ合衆国に本社を置く、世界最大のコンピュータネットワーク機器開発会社及び同社の製品

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2022/12/14 11:41

前提

CiscoのvManage APIを実行し、
受け取ったJsonから任意の条件でpandasで表を作り、
手持ちのcsvリストと突き合わせたいと考えております。

API
・http;//{vmanage}/dataservice/device
CSV(Bucketに格納)
・tmp/device_info.csv

<device_info.csv>
device-model, IPsecTunnel
deviceABC, 123
deviceEDF, 456
deviceGHI, 789

環境変数
CSV_DEVICE_INFO : device_info.csv(デバイス名とトンネル数の一覧)
CSV_VMANAGE_INFO : vmanage_info.csv(vmanage接続情報)
S3_BUCKET : s3のバケット名

<API条件>
APIの結果においてreachabilityがreachableのみが対象
reachableのデバイスと、デバイスリストの一覧を突き合わせ
IPsecTunnelを付与した一覧を作成する

【問題】
結合後に、各行へ取得時間(datetime)を付与しようと試みたが、
末尾に追加しようと試みましたが任意の場所に入れられず。

pandasとの結合から見直すべきか、datetimeの修正で完了できるかご助言いただければと思います。

■■な機能を実装中に以下のエラーメッセージが発生しました。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 取得時刻を任意の列に挿入を実現したい
  • pandasの利用見直しの可能性も検討

発生している問題・エラーメッセージ

dtを任意の列(先頭、末尾など)に移動したい

結合結果
vmanage-host, system-ip, host-name, device-model, bfdSessionUp, bfdSessions, dt, IPsecTunnel
vmanageXYZ, 1.2.3.4, hostABC, deviceABC, 9, 9, 2022/01/01 00:00:00, 999
vmanageXYZ, 1.2.3.5, hostEDF, deviceEDF, 8, 8, 2022/01/01 00:00:00, 888
vmanageXYZ, 1.2.3.6, hostGHI, deviceGHI, 7, 7, 2022/01/01 00:00:00, 777

該当のソースコード

Lambda(Python)

1import json 2import boto3 3import csv 4import numpy as np 5import pandas as pd 6 7import requests 8import os 9import urllib3 10from datetime import datetime 11urllib3.disable_warnings(urlib3.exceptions.InsecureRequests.InsecureRequestWarning) 12 13def lambda_handler(event, context): 14 s3 = boto3.resource(`s3`) 15 bucket_name _ os.environ.get(`S3_BUCKET`) 16 vmange_info_df = pd.read_csv(vnamage_info) 17 18 device_info = "tmp/device_info.csv" 19 bucket.download_file(os.environ.get(`CSV_DEVICE_INFO`), device_info) 20 device_info_df = pd.read.csv(device_info) 21 22 print(device_info_df) 23 24 ipsec_tunnel_df = get_request(vmanage_info_df) 25 26 merge_key = [`device-model`] 27 df = pd.merge(ipsec_tunnel_df, device_info_df, how=`right`, on=merge_key) 28 temp_csv = "/temp/bfdsession_test.csv" 29 df.to_csv(temp_csv, encoding=`utf-8`, index=False) 30 31 s3 = boto3.resource(`s3`) 32 s3.meta.client.upload_file(tmp_csv, `xxxxxxx-vmanage-bucket`, `bfdsession_test.csv`) 33 34def get_request(vmanage_info_df): 35 api_datalist = [] 36 for row in vmanage_info_df.intertuples(): 37 vmanage_host = row[1] 38 vmanage_port = row[2] 39 vmanage_username = row[3] 40 vmanage_password = row[4] 41 42 base_url = `https://%s:%s`%(vmanage_host, vmanage_port) 43 44 login_action = `/j_security_check` 45 46 login_data = {`j_username` : vmanage_username, `j_password` : vmanage_password} 47 48 login_url = base_url + login_action 49 50 session = requests.session() 51 52 login_response = session.post(url=login_url, data=login_data, verify=False) 53 if login_token.status_code = 200: 54 if b`<html>` in login_token.content: 55 print("Login token Failed") 56 exit(1) 57 58 session.headers[`X-XSRF-TOKEN`] = login_token.content 59 60 61 device_url = base_url + `/dataservice/device` 62 63 device_list = session.get(url=device_url, verify=False) 64 if device_list.status_code == 200: 65 json_data = device_list.json() 66 else: 67 print (device_list.status_code) 68 69 df = pd.json_normalize(json_data["data"]) 70 df = df[(df["device-type"] == "vedge") & (df["reachability"] == "reachable")] 71 df = df[["system-ip", "host-name", "device-model", "bfdSessionUp", "bfdSessions"]] 72 df.insert(0, `vmanage_host`, row[1]) 73 74 df[`dt`] = datetime.now()strftime(`%Y/%m/%d %H:%M:%S`) 75 76 print(df) 77 78return df

試したこと

df.insert(1, datetime, df[dt])
→追加できず。row[1]とかぶっているため?

df.insert(len(df.colums), datetime, dt)
→エラーで追加できず。

補足情報(FW/ツールのバージョンなど)

Python3.8

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

先頭に追加する場合。

python

1c = df.pop('dt') 2df.insert(0, c.name, c)

末尾に追加する場合。

python

1c = df.pop('dt') 2df.insert(df.shape[1], c.name, c)

投稿2022/12/14 12:06

編集2022/12/14 12:08
melian

総合スコア19749

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msy47

2022/12/22 02:10

回答ありがとうございます! 末尾に追加することができました。 1点気になるのは、先頭に入れても 72行目の df.insert(0, `vmanage_host`, row[1]) とバッティングしないのかなといった疑問が生じました。
melian

2022/12/22 02:18

カラム名(vmanage_host)が異なりますので問題ないかと思います。
msy47

2022/12/22 03:05

回答ありがとうございます!
msy47

2022/12/22 05:49

どちらもベストアンサーとさせていただきたく!ありがとうございます!
guest

0

dtを任意の列(先頭、末尾など)に移動したい

ようするに列を並べ替えたいだけならreindexで自由にできます。
参考:pandas.DataFrameの行・列を任意の順に並べ替えるreindex

Python

1import pandas as pd 2 3df = pd.DataFrame({'a':[1],'b':[2],'c':[3]}) 4print(df) 5# a b c 6#0 1 2 3 7 8cols = [c for c in df.columns if c != 'a'] + ['a'] # a列を末尾に移動 9#cols = ['b','c','a'] # 直に指定したほうが手っ取り早いかも 10df = df.reindex(columns=cols) 11print(df) 12# b c a 13#0 2 3 1

投稿2022/12/14 12:01

編集2022/12/14 12:03
can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

msy47

2022/12/22 02:11

回答ありがとうございます! こちらまだ動作確認ができておらず。。。 できればこちらのような柔軟な場所に列を挿入したく考えております。
msy47

2022/12/22 02:24

colums = [`dt`, `vmanage-host`, `system-ip`, `hostname`, `device-model`, `bfdSessionsUp`, `bfdSessions`,`bfdSessions`, `IPsecTunnel`] df = df.reindex(colums) のように修正を怖したところ、以下のような結果が出力されました、どこに問題があるのでしょうか。 ご助力いただきたく vmanage-host, host-name, bfdSessions, bfdSessions vmanage-hosnm, Nan, Nan, Nan, Nan, Nan, Nan,
can110

2022/12/22 04:36

回答コードのようにパラメータcolumnsを指定してください。
msy47

2022/12/22 05:47

できました!ありがとうございます! 8行目のパターンでも、9行目のパターンでも動作を確認できました ありがとうございます。
msy47

2022/12/22 05:49

どちらもベストアンサーとさせていただきたく!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問