【问题标题】:Mapping values into a new dataframe column将值映射到新的数据框列
【发布时间】:2016-06-04 08:15:45
【问题描述】:

我有一个数据集(约 7000 行),我已在 Pandas 中导入了一些“数据争论”,但我需要一些正确方向的指针才能采取下一步。我的数据如下所示,它是对具有多个子级别的结构的描述。 BDBA 的子级别。 CB 的子级别。等等……

等级、名称
0, A
1、乙
2、C
1、D
2、电子
3、F
3、G
1、乙
2、C

但我想要类似下面的东西,NameMother_name 在同一行:

等级、姓名、母名
1、B、A
2、C、B
1、D、A
2、E、D
3、F、E
3、G、E
1、B、A
2、C、B

【问题讨论】:

  • 你能完全指定Name -> Mother_name映射吗(最好用字典)?
  • 谢谢,但我认为我不能轻松地指定映射(您有什么技巧可以做到这一点吗?)。该列表长约 7000 行,最多 10 个级别。例如,K 可以有孩子DGM 可以有孩子 DX。第一个示例中D 的母亲是K,第二个示例中是X。对不起,如果我的解释令人困惑。
  • 我认为你需要回到你的数据模式和这个问题的绘图板上。目前尚不清楚派生列是如何计算的。当问题得到正确表述时,数据框的大小是无关紧要的。
  • 数据为产品物料清单。具有多个子组件的组件。顶部组件包含例如“螺栓”和“螺母”,但子组件也可以包含相同种类的螺栓和螺母。这也许可以解释奇怪的数据模式。

标签: python pandas


【解决方案1】:

如果我正确理解格式,name 的父级取决于 其level 比当前行的level 小一的最近前一行。

您的 DataFrame 的行数适中 (~7000)。所以几乎没有伤害(对 性能)简单地遍历行。如果 DataFrame 非常 大,如果您可以使用按列矢量化的 Pandas,您通常会获得更好的性能 操作而不是逐行迭代。然而,在这种情况下,似乎 使用按列向量化的 Pandas 操作很尴尬,而且 过于复杂。所以我相信逐行迭代是这里的最佳选择。

使用df.iterrows进行逐行迭代,你可以简单的记录当前每一层的父母,并根据需要填写“母亲”:

import pandas as pd
df = pd.DataFrame({'level': [0, 1, 2, 1, 2, 3, 3, 1, 2],
                   'name': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'B', 'C']})

parent = dict()
mother = []
for index, row in df.iterrows():
    parent[row['level']] = row['name']
    mother.append(parent.get(row['level']-1))
df['mother'] = mother
print(df)

产量

   level name mother
0      0    A   None
1      1    B      A
2      2    C      B
3      1    D      A
4      2    E      D
5      3    F      E
6      3    G      E
7      1    B      A
8      2    C      B

【讨论】:

    【解决方案2】:

    如果你可以像字典一样指定两列的映射,那么你可以只使用原始列的map方法。

    import pandas
    names = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'B', 'C']
    
    # name -> sublevel
    sublevel_map = {
        'A': 'A',
        'B': 'A',
        'C': 'B',
        'D': 'A',
        'E': 'D',
        'F': 'E',
        'G': 'E'
    }
    
    df = pandas.DataFrame({'Name': names})
    df['Sublevel'] = df['Name'].map(sublevel_map)
    

    这给了你:

      Name Sublevel
    0    A        A
    1    B        A
    2    C        B
    3    D        A
    4    E        D
    5    F        E
    6    G        E
    7    B        A
    8    C        B
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-15
      • 2020-06-21
      • 2021-09-29
      • 2019-04-12
      • 2021-08-21
      • 2019-11-13
      • 2019-03-21
      • 2020-08-26
      相关资源
      最近更新 更多