【问题标题】:Transpose Multidimensional Table转置多维表
【发布时间】:2013-02-27 08:21:44
【问题描述】:

我目前正在解析大量 PDF,并根据它们所属的模块提取硬件地址列表。这个想法是构建一个依赖关系图,这将有助于任何未来的代码逆向。 由于问题的性质非常大,我使用 pandas 作为主要的数据库 API,因为它很容易将函数应用于列。

数据库 数据库包含两个字段,即地址和模块名称(见下文)。 其中每条记录详细说明了单个(且唯一)地址相对于其成员的模块的成员资格。 Associate Modules 字段的类型为 List 并且可以具有不同数量的元素。但是地址只有一个值。

问题 理想情况下使用优化的 Pandas API,如何将下面的“RawTable”转换为 “依赖表”?非常感谢代码示例。

<Current Database>
xxxxx*[Pandas::RawTable]******
* Address * Associate Modules *
******************************
*   1000  * ["1A","2A","3A"] *
*   1001  * ["2A","4A","5A"] *
*   1002  *   ["1A", "4A"]   *
******************************

<Future Database>
******[Pandas:: DependencyTable****
* Associate Modules *   Address   *
***********************************
*     "1A"         *     1000     *
*     "1A"         *     1002     *
*     "2A"         *     1000     *
*     "2A"         *     1001     *
*     "3A"         *     1000     *
*     "4A"         *     1001     *
*     "4A"         *     1002     *
*     "5A"         *     1001     *
***********************************

感谢您的帮助。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    看起来模块是作为一列列表加载的。

    In [1]: df = DataFrame(
            {'Address': [1000, 1001, 1002],
            'Associate Modules': [['1A', '2A', '3A'],
                                  ['2A', '4A', '5A'], 
                                  ['1A', '4A']]})
    

    我会先将相关的模块分成不同的列。

    In [2]: modules = df['Associate Modules'].apply(Series)
    In [3]: modules.index = df['Address']
    In [4]: modules
    Out[4]: 
              0   1    2
    Address             
    1000     1A  2A   3A
    1001     2A  4A   5A
    1002     1A  4A  NaN
    

    然后堆叠 DataFrame,并删除我们的虚拟列索引。

    In [5]: result = modules.stack()
    In [6]: result.index = result.index.get_level_values(0)
    
    In [7]: result
    Out[7]: 
    Address
    1000       1A
    1000       2A
    1000       3A
    1001       2A
    1001       4A
    1001       5A
    1002       1A
    1002       4A
    

    如果您希望地址作为适当的列而不是索引,请使用reset_index() 方法。可能有一种更时尚的方式,但不会太丑。

    【讨论】:

      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 2010-10-22
      • 2018-06-10
      相关资源
      最近更新 更多