我有一个数据集(约7000行),我已经在Pandas中导入了一些“数据争论”,但我需要一些正确方向的指针才能进行下一步。我的数据类似于下面的内容,它描述了具有多个子级别的结构。 B
,D
和B
是A
的子级别。 C
是B
的子级别。等等...
等级,名称
0,A
1,B
2,C
1,D
2,E
3,F
3,G
1,B
2,C
但我想要类似下面的内容,Name
和Mother_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
答案 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