将值映射到新的数据帧列

时间:2016-02-22 18:51:22

标签: python pandas

我有一个数据集(约7000行),我已经在Pandas中导入了一些“数据争论”,但我需要一些正确方向的指针才能进行下一步。我的数据类似于下面的内容,它描述了具有多个子级别的结构。 BDBA的子级别。 CB的子级别。等等...

等级,名称
0,A
1,B
2,C
1,D
2,E
3,F
3,G
1,B
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

2 个答案:

答案 0 :(得分:1)

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

您的DataFrame具有适度的行数(~7000)。所以没有什么害处(对 简单地遍历行。如果DataFrame非常好 大,如果你可以使用列式矢量化熊猫,你通常会获得更好的性能 操作而不是行式迭代。但是,在这种情况下,它似乎 使用逐列向量化的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

答案 1 :(得分:0)

如果您可以在字典之类的内容中指定两列的映射,那么您只需使用原始列的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