getValueOfNode(node.find())を使用してPandas DataFrameで最初の行のみを取得する -- python フィールド と pandas フィールド と dataframe フィールド 関連 問題

Only getting first row in pandas Dataframe with getvalueofnode(node.find())












1
vote

問題

日本語

私はAPI呼び出しをし、応答XMLをループしてデータフレームに関連する値を抽出したいと考えています。コードは早くうまく機能していましたが、今ではそれは明らかにノード/列ごとに最初の値を超えて返したくないです。

これは私の応答XMLです:

<事前> <コード> <?xml version="1.0" encoding="utf-8"?> <Assets xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <IsLastPage>true</IsLastPage> <AssetRecords> <Asset url="https://api.myvisionlink.com/APIService/VLReady/assets/single/1486128866430645"> <VisionLinkIdentifier>1486128866430645</VisionLinkIdentifier> <MakeCode>CAT</MakeCode> <MakeName>CAT</MakeName> <SerialNumber>PNL00585</SerialNumber> <AssetID>10-143</AssetID> <EquipmentVIN/> <Model>320ELRR</Model> <ProductFamily>TRACK EXCAVATORS</ProductFamily> <ManufactureYear>2015</ManufactureYear> </Asset> <Asset url="https://api.myvisionlink.com/APIService/VLReady/assets/single/2278960667345107"> <VisionLinkIdentifier>2278960667345107</VisionLinkIdentifier> <MakeCode>CAT</MakeCode> <MakeName>CAT</MakeName> <SerialNumber>HBT20130</SerialNumber> <AssetID>10-160</AssetID> <EquipmentVIN/> <Model>330FL</Model>

など。

そしてこれは私のコードです:

<事前> <コード> r = session.get("https://api.myvisionlink.com/APIService/VLReady/Assets/1", headers={'Content-Type':'application/xml'}) def getvalueofnode(node): return node.text if node is not None else None def main(): root = cET.fromstring(r.content) ns = {"xsd":"http://fms-standard.com/rfms/v1.0.0/xsd/position", "xsi":"http://fms-standard.com/rfms/v1.0.0/xsd/common/position"} data_list = [{'Make': getvalueofnode(node.find('Asset/MakeName', ns)), 'SerialNumber': getvalueofnode(node.find('Asset/SerialNumber', ns)), 'AssetID': getvalueofnode(node.find('Asset/AssetID', ns)), 'Model': getvalueofnode(node.find('Asset/Model', ns)), 'ProductFamily': getvalueofnode(node.find('Asset/ProductFamily', ns)), 'ManufactureYear': getvalueofnode(node.find('Asset/ManufactureYear', ns))} for node in root] global df_xml df_xml = pd.DataFrame(data_list) main()

結果のデータフレームは次のとおりです。 応答コード

英語

I have made an API call and want to loop through the response xml to extract the relevant values to a dataframe. The code has worked fine earlier, but now it apparentely does not want to return more than the first value per node/column.

This is my response XML:

<?xml version="1.0" encoding="utf-8"?> <Assets xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">     <IsLastPage>true</IsLastPage>     <AssetRecords>         <Asset url="https://api.myvisionlink.com/APIService/VLReady/assets/single/1486128866430645">             <VisionLinkIdentifier>1486128866430645</VisionLinkIdentifier>             <MakeCode>CAT</MakeCode>             <MakeName>CAT</MakeName>             <SerialNumber>PNL00585</SerialNumber>             <AssetID>10-143</AssetID>             <EquipmentVIN/>             <Model>320ELRR</Model>             <ProductFamily>TRACK EXCAVATORS</ProductFamily>             <ManufactureYear>2015</ManufactureYear>         </Asset>         <Asset url="https://api.myvisionlink.com/APIService/VLReady/assets/single/2278960667345107">             <VisionLinkIdentifier>2278960667345107</VisionLinkIdentifier>             <MakeCode>CAT</MakeCode>             <MakeName>CAT</MakeName>             <SerialNumber>HBT20130</SerialNumber>             <AssetID>10-160</AssetID>             <EquipmentVIN/>             <Model>330FL</Model> 

etc.

And this is my code:

r = session.get("https://api.myvisionlink.com/APIService/VLReady/Assets/1", headers={'Content-Type':'application/xml'})   def getvalueofnode(node):     return node.text if node is not None else None  def main():    root = cET.fromstring(r.content)    ns = {"xsd":"http://fms-standard.com/rfms/v1.0.0/xsd/position",          "xsi":"http://fms-standard.com/rfms/v1.0.0/xsd/common/position"}     data_list = [{'Make': getvalueofnode(node.find('Asset/MakeName', ns)),                  'SerialNumber': getvalueofnode(node.find('Asset/SerialNumber', ns)),                  'AssetID': getvalueofnode(node.find('Asset/AssetID', ns)),                  'Model': getvalueofnode(node.find('Asset/Model', ns)),                  'ProductFamily': getvalueofnode(node.find('Asset/ProductFamily', ns)),                  'ManufactureYear': getvalueofnode(node.find('Asset/ManufactureYear', ns))} for node in root]     global df_xml    df_xml = pd.DataFrame(data_list)  main() 

The resulting DataFrame I get is as follows:Response code

</div
        

回答リスト

1
 
vote
vote
ベストアンサー
 

あなたがあなたのAPI呼び出しから戻ってきた結果についてはわかりませんが、XMLはあなたの質問に提供されたあなたのサンプルで不正行為されています。 XMLの構造がXML構造のルートにある場合、XMLの構造が異なる場合は、コードが機能しました。

最初のレコードを取得しているのは、「islastpage」要素と "assetrecords"要素を繰り返すため、find()を使用していて見つけていない()では1回停止しているためです。最初の試合が見つかります。 find()を使用してfindall()を使用し続ける場合は、コードを下のコードで変更したものである "AssetRecords"要素を繰り返すようにコードを変更する必要があります。

<事前> <コード> IWebElement element = (IWebElement) ((IJavaScriptExecutor)driver).ExecuteScript("return $('#.myElementId');") 0 <事前> <コード> IWebElement element = (IWebElement) ((IJavaScriptExecutor)driver).ExecuteScript("return $('#.myElementId');") 1

あなたが何かを明確にする必要があるならば、あなたの質問に答えることを願ってください。 :)

 

I am not sure about the result you're getting back from your API call, but the xml looks malformed in the sample your provided with your question. Your code would have worked if the structure of the XML was different say if the asset elements were in the root of your XML structure.

The reason you're only getting the first record is because you're iterating through the "IsLastPage" element and the "AssetRecords" element, and since you're using find() and not findall() it is stopping once it finds the first match. If you want to continue to use find() and not findall() you have to modify your code to iterate through the "AssetRecords" element which is what I modified in your code below.

def main():    root = et.fromstring(xml)    ns = {"xsd":"http://fms-standard.com/rfms/v1.0.0/xsd/position",          "xsi":"http://fms-standard.com/rfms/v1.0.0/xsd/common/position"}     # Find AssetRecords element    asset_records = root.find("AssetRecords")     data_list = [{'Make': getvalueofnode(node.find('MakeName', ns)),                  'SerialNumber': getvalueofnode(node.find('SerialNumber', ns)),                  'AssetID': getvalueofnode(node.find('AssetID', ns)),                  'Model': getvalueofnode(node.find('Model', ns)),                  'ProductFamily': getvalueofnode(node.find('ProductFamily', ns)),                  'ManufactureYear': getvalueofnode(node.find('ManufactureYear', ns))} for node in asset_records]     global df_xml    df_xml = pd.DataFrame(data_list) 
Output:  Make SerialNumber AssetID    Model     ProductFamily ManufactureYear 0  CAT     PNL00585  10-143  320ELRR  TRACK EXCAVATORS            2015 1  CAT     HBT20130  10-160    330FL  TRACK EXCAVATORS            2015 

Hope that answers your question, if you need me to clarify anything please let me know. :)

</div
 
 
   
   

関連する質問

96  データフレームセル内のリストを別々の行に爆発させる方法  ( How to explode a list inside a dataframe cell into separate rows ) 
リストを含むPandasセルをそれらの値それぞれの行に変えることを目指しています。 だから、これを取ります: nearest_neighbors 列の値を解凍してスタックしたい場合は、各値が各 opponent indextでは行になるようにしてく...

12  Rの重複属性を持つ行を取り除きます  ( Get rid of rows with duplicate attributes in r ) 
私は次のような列を持つ大きなデータフレームを持っています。 <事前> <コード> ID, time, OS, IP そのデータフレームの各行は1つのエントリに対応します。一部の IDS 複数のエントリ(行)のデータフレーム内には存在します。それらの複数行を...

1  R - コマンドライン引数によってデータフレーム名を決定したい  ( R i want data frame name to be determined by a command line argument ) 
コマンドライン引数でデータフレーム名を決定したいです。以下は、私がやろうとしていることを明確にするようにしてください...私は願っています! 使用: <事前> <コード> Context ctx = getApplicationContext(); S...

1  データフレームの各列をフィルタリングすると、比類のない値の場合はNA  ( Filtering each column of a data frame an put na for unmatched values ) 
私は以下のような表を持っています: <事前> <コード> [,1] [,2] [,3] [,4] [,5] [1,] a A 0.06 0.31 -1.5 [2,] b B -0.75 0.2 ...

0  Pandasを使って最寄りの分をマージします  ( Merge with the nearest minute using pandas ) 
私は単に±1分の間隔で2つのデータフレームをマージしたいです。 ここにサンプルデータセットを持つname_df: <事前> <コード> Name Date A 2/19/2019 17:16:15 B 2/19/2019 17:...

1  データフレーム内のエントリの変更は、2つの値の間にあるか、値の下にあるかどうかに応じて  ( Changing entries in a dataframe depending on whether they are between two values ) 
私は1列の距離を持つデータフレームと他の列のスコア、例えば <事前> <コード> Distance Scores 1000. 1 1500. 1 ETC。 私は言う区分的な機能を持っています: 距離&gt = 1000の場合、スコアをゼロに変...

2  パンダの行を変更します  ( Change rows in pandas ) 
Pandasデータフレームにマトリックスを持っています <事前> <コード> print dfMatrix 0 1 2 3 4 0 10000 10 8 11 ...

1  Pandas Groupbyをグループ行グループに使用するには、列値を合計して決定できますか?  ( Can you use pandas groupby to group rows determined by summing a column value ) 
データフレームの行を1列の値でグループ化したいと思います。以下に示す例は、iが150の値で 'NumberOfTrades'の値をグループ化していた場合であるので、上位2行がグループ化され、下位3行がグループ化されます。私が理解している次のステップは、各グルー...

1  タプルを鍵と値として辞書するPandas DataFrame  ( Pandas dataframe to dictionary with tuples as key and values ) 
私は以下の手助けが必要です: 私は以下のようにCSVファイルを持っていて、データフレーム 'DF'にロードされます。複数の領域、メモリ、VCPU、および各 '名前'に対応するストレージには異なる値があります。このデータフレームには1700行があります。 ...

4  rbind()を使用して、複数のデータフレームを1つの大きさのデータに組み合わせる。  ( Using rbind to combine multiple data frames into one larger data frame within ) 
R-Studio 0.99.491とRバージョン3.2.3(2015-12-10)を使用しています。私はrの相対的なニュービーです、そして私はいくつかの助けに感謝します。私は、古いメディアサーバー上のサーバーログを使用しようとしているプロジェクトをやっていま...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有