在数据帧中移动/滴流更新

时间:2016-04-18 18:54:17

标签: python pandas dataframe

我有一个DataFrame,其中包含路径,父路径和目录的大小。 但是,这里的问题是目录大小包含sub-dirs的大小。这需要我在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

我正在尝试计算以下内容:

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)

1 个答案:

答案 0 :(得分:2)

以下内容可能对您有用:确定每行的深度level,自下而上迭代,并将Size添加到parent所标识的Path

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