2013-04-02 13 views
7

私は最終的にグラフを作成できるように、HTML入力ファイルから行を読み込み、Series/DataFramesを準備しようとしています。私はlxmlのobjectifyを使ってHTMLデータの行を取り出し、リストに変換しています。リストデータを取得してSeriesまたはDataFrameを作成しようとすると、リスト内の項目数に等しい数の要素を含むSeries(またはDataFrame)が取得されますが、要素のデータはリストそのものです。私は私の問題を表示することができdictのリストをSeriesに変換する

最も簡単な方法は次のとおりです。

0  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
1  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
2  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
3  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
4  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
5  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
6  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
7  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
8  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
9  [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
10 [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
11 [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
12 [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 
13 [[[192.168.1.0, XXDHCP, Y, 255, 0, YYDHCP, Y, ... 

type(htmldata[0])は次のとおりです:lxml.objectify.StringElement
type(htmldata[3])さ:

from lxml import etree 
from lxml import objectify 
from pandas import Series 
line='<tr class="alt"><td>192.168.1.0</td><td>XXDHCP</td><td>Y</td><td>255</td><td>0</td><td>YYDHCP</td><td>Y</td><td>250</td><td>0</td><td>0%</td><td>505</td><td>505</td><td>0</td><td></td></tr>' 
htmldata=(objectify.fromstring(line)).getchildren() 
htmlseries=Series(htmldata) 

htmlseriesは、のように見える終わるlxml.objectify.IntElement

Iながら次のようなものを探しています:

0  192.168.1.0 
1   XXDHCP 
2    Y 
3    255 
4    0 
5   YYDHCP 
6    Y 
7    250 
8    0 
9    0% 
10   505 
11   505 
12    0 
13    

私は間違っていますか?私は何が起こっているのか謎めいている。私は、リストに各列を読み込むしようとすると:

data=objectify.fromstring(line).getchildren() 
labdata[ip]['Scope'].append(data[0]) 
labdata[ip]['Cluster1'].append(data[1]) 
labdata[ip]['Active1'].append(data[2]) 
...etc... 

私のリストは、ように見える終わる:

labdata['192.168.1.0']['Utilization'] 
['100%', 
'96%', 
'96%', 
'90%', 
'81%', 
'96%', 
'90%', 
'97%', 
'98%', 
'92%', 
'99%', 
...etc... 
] 

しかし、いくつかの理由:

Series(labdata['192.168.1.0']['Utilization']) 
0  [[[192.168.1.0, XXDHCP, Y, 0, 383, YYDHCP, Y... 
1  [[[192.168.1.0, XXDHCP, Y, 28, 355, YYDHCP, ... 
2  [[[192.168.1.0, XXDHCP, Y, 28, 355, YYDHCP, ... 
3  [[[192.168.1.0, XXDHCP, Y, 76, 307, YYDHCP, ... 
4  [[[192.168.1.0, XXDHCP, Y, 104, 279, YYDHCP,... 
5  [[[192.168.1.0, XXDHCP, Y, 27, 356, YYDHCP, ... 
6  [[[192.168.1.0, XXDHCP, Y, 66, 317, YYDHCP, ... 
7  [[[192.168.1.0, XXDHCP, Y, 15, 368, YYDHCP, ... 
8  [[[192.168.1.0, XXDHCP, Y, 15, 368, YYDHCP, ... 
9  [[[192.168.1.0, XXDHCP, Y, 54, 329, YYDHCP, ... 
...etc... 

type(labdata['192.168.1.0']['Utilization'][0])lxml.objectify.StringElement

ですこれらの要素を通常の文字列やintにキャストする必要がありますか?

+0

labdata ['192.168.1.0'] ['Utilization'] ''のタイプが実際には '' list''であることを確認してください。それはリストのようなものですが実際にはリストではなく、シリーズの最初の要素の型も示します。 '' type(s [0]) '' – Jeff

+0

なぜこれを下降させたのですか?問題は分かりやすく、実績のあるSSCCEをすでに提供しています。欠落している唯一のものは望ましい出力の記述ですが、文脈ではかなり明確だと思います。 – DSM

+2

@ dooz:回避策として、 'Series(obj.pyval for htmldata)'を使うことができます。私はすぐになぜそれを見ることができませんが、 'lxml.objectify。* Element'オブジェクトに関することは、Seriesの構築ではうまくいきません。 – DSM

答えて

7

問題がhtmldataの要素が単純型ではありませんで、これは我々がの-リストリストまたはスカラーのリストを持っているかどうかを だけの要素を文字列化する方法その判断されたようnp.isscalarが( ここでされてだまされますこの

In [23]: print [ type(x) for x in htmldata ] 
[<type 'lxml.objectify.StringElement'>, <type 'lxml.objectify.StringElement'>, <type 'lxml.objectify.StringElement'>, <type 'lxml.objectify.IntElement'>, <type 'lxml.objectify.IntElement'>, <type 'lxml.objectify.StringElement'>, <type 'lxml.objectify.StringElement'>, <type 'lxml.objectify.IntElement'>, <type 'lxml.objectify.IntElement'>, <type 'lxml.objectify.StringElement'>, <type 'lxml.objectify.IntElement'>, <type 'lxml.objectify.IntElement'>, <type 'lxml.objectify.IntElement'>, <type 'lxml.objectify.StringElement'>] 

In [24]: Series([ str(x) for x in htmldata ]) 
Out[24]: 
0  192.168.1.0 
1   XXDHCP 
2    Y 
3    255 
4    0 
5   YYDHCP 
6    Y 
7    250 
8    0 
9    0% 
10   505 
11   505 
12    0 
13    
+0

Ah、+1。私は 'isscalar'がSageの問題を引き起こしていることを覚えています。' numpy'はSage整数をスカラーとして認識しないので、配列のインデクシングは正しく機能しません。私はより多くのタイプ情報を保存するので、私は 'pyval'アプローチを好むと思います。 – DSM

+0

が合意しました....それ以外の点では、ユーザーが本当にシリーズ要素としてリストを渡しているかどうかを判断するのにかなり集中しているので、パンダの終わりにすることはできません。それは良いアイデアです – Jeff

2

ニースの質問に動作します!これは奇妙な動作です。

あなたはシリーズリストにlxml.objectify.StringElement Sを渡しているため、問題が発生する。pandasnp.array Sに裏打ちされたため、そのデータが保存されていことを好むています均一な配列で。したがって、すべてをnp.objectに抽象化して、アレイにそれらを押し込むことができます。実際には、データの基底配列(Series.values)を見ると、それはうまく作成されていることがわかりますが、それはおそらくあなたが望むものではないlxml.objectify.StringElementsという数の配列です。

簡単な解決策はもちろん、すべてをストリングにキャストすることです。この場合、おそらくあなたがしたいことです。


しかし、どうしてそれは面白いですか?あなたはパンダのコードをドリルスルー場合さて、あなたはpandas.core.commonに次の関数で終わる:パンダ、言い換えれば

def _is_sequence(x): 
    try: 
     iter(x) 
     len(x) # it has a length 
     return not isinstance(x, basestring) and True 
    except Exception: 
     return False 

lxmlのオブジェクトはbasestringsではないことを認識し、それゆえ、彼らは順序だ前提としています。パンダはおそらくisinstance(x, collections.Sequence)をチェックすべきです。

+0

! – Jeff