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

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

新規登録して質問してみよう
ただいま回答率
86.02%
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

解決済

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

msy47
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はプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

2回答

0グッド

0クリップ

358閲覧

投稿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

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

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

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

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

下記のような質問は推奨されていません。

  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答2

1

ベストアンサー

先頭に追加する場合。

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

総合スコア17081

msy47👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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

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

1

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

総合スコア36974

msy47👍を押しています

下記のような回答は推奨されていません。

  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

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はプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。