用数据帧中的值替换外部文件中的值时如何跳过某个值?

问题描述 投票:0回答:1

我有一个由以下条目组成的文件:

A       first = 4 | 1_3_5_4        Name1                                  
labelToSkip
i = 1000000 j = -3 k = -15
end

B       first = 4 | 9_2_2_4        Name2                                  
labelToSkip
i = 150000 j = -3 k = -20
end
...

我问了一个关于如何用 Pandas 数据帧中的相应值替换文件中的某些值的问题,例如:

    i      j      k     
0   unit1  unit2  unit3
1   1000   100    84      
2  -3000   200    60       
3  -2000   90     195      
4   900    40     209 

如何将 Pandas (Python) 数据帧中的特定值写入文件中的特定位置(即标识符之后)?

我得到了一个很好的解决方案。但是,我的文件中有一些行只需要替换 i 和 k 值。即,数据框看起来像:

    i      k     
0   unit1  unit3
1   1000   84      
2  -3000   60       
3  -2000   195      
4   900    209 

在这种情况下,当我运行解决方案时没有任何反应。我尝试将“idx”更改为 2。我什至尝试将 idx 更改为“1”并仅针对 i 运行它(已删除与 j 和 k 相关的任何内容),然后运行 k。那也行不通。我无法在网上找到任何有关如何忽略/跳过字段的信息。如果有人有提示,我将不胜感激。

python python-3.x pandas dataframe file-io
1个回答
1
投票

调整解决方案,不考虑具有多个字段的固定行,而是单独考虑字段。这里我们拆分

\n\n
来分别处理各个块。

import re

idx = 3
to_replace = 'B'

with (open('/tmp/input_file.txt', 'r') as f_in,
      open('output_file.txt', 'w') as f_out):
    s = df.loc[idx]
    pat = r'\b(%s)\b(\s*=\s*)(\d+)' % '|'.join(s.index)
    
    f_out.write('\n\n'.join(
         re.sub(pat, lambda m: fr'{m.group(1)}{m.group(2)}{s.loc[m.group(1)]}',
                 block, flags=re.M | re.S)
         if block.startswith(to_replace) else block
         for block in re.split('\n\n', f_in.read())
         )  
               )

输出:

A       first = 4 | 1_3_5_4        Name1                                  
labelToSkip
i = 1000000 j = -3 k = -15
end

B       first = 4 | 9_2_2_4        Name2                                  
labelToSkip
i = -2000 j = -3 k = -20
end
© www.soinside.com 2019 - 2024. All rights reserved.