2016-04-18 8 views
3

DataFrameには、パス、親パス、およびディレクトリのサイズが含まれています。 しかしの場合、ディレクトリサイズにはにサブディレクトリのサイズが含まれていません。これには、DataFrameを複数回にわたって「掃引」して更新する必要があります。もう一つの捉え方は、私が下に向かって始め、データを再計算する必要があるということです。私はの線に沿って何かを計算しようとしているデータフレーム内の更新の移動/トリック

Parent Path Size 

/  /a   10 
/  /b   20 
/a  /a/x  1 
/a  /a/y  2 
/a  /a/z  3 
/a/x  /a/x/a1 99 

現在DataFrameがどのように見える

Parent Path Size 

/  /a   115 (sum of size of /a, /a/x) 
/  /b   20 
/a  /a/x  100 (sum of size of /a/x and /a/x/a1) 
/a  /a/y  2 
/a  /a/z  3 
/a/x  /a/x/a1 99 

を基本的には、アップデートは下部に開始(すなわち、ノード/ディレクトリを残します)、トップレベルのディレクトリにトリックルします。私は下部からデータフレームを反復処理する方法と、すべての連続した更新が常に最新の値を取得する方法については困惑していますか?任意のアイデアは感謝、感謝。

スニペットは、データフレームを作成します。

txt = '''/  /a   10 
/  /b   20 
/a  /a/x  1 
/a  /a/y  2 
/a  /a/z  3 
/a/x  /a/x/a1 99''' 
rows = [ line.split() for line in txt.split('\n') ] 
df = pd.DataFrame(data=rows, columns=['Parent', 'Path', 'Size']) 
df['Size'] = df['Size'].astype(float) 

答えて

2

以下のあなたのために働くかもしれない:各行の深さlevel、反復ボトムアップを識別し、Pathによって識別されるようparentにそれぞれSizeを追加します。

df['level'] = df.Path.str.count('/') 

for level in reversed(range(1, max(df.level) + 1)): 
    data = df[df.level==level] 
    for i, row in data.iterrows(): 
     parent = '/'.join(row.Path.split('/')[:-1]) 
     df.loc[df.Path == parent, 'Size'] += int(row.Size) 

df 

    Parent  Path Size level 
0 /  /a 115  1 
1 /  /b 20  1 
2  /a  /a/x 100  2 
3  /a  /a/y  2  2 
4  /a  /a/z  3  2 
5 /a/x /a/x/a1 99  3 
+0

ありがとう、私はこのコメントを受け入れますが、このアプローチは大規模なデータセット(何百万行も)では実際には機能しません。例えば、 200万レコードを処理するには、約12時間かかります!! – sasuke

関連する問題