2016-02-22 3 views
0

У меня есть набор данных (~ 7000 строк), который я импортировал в Pandas для некоторых «перетасовки данных», но мне нужны некоторые указатели в правильном направлении, чтобы сделать следующий шаг. Мои данные выглядят примерно так: это описание структуры с несколькими суб-уровнями. B, D и снова B являются нижними уровнями до A. C - это дополнительный уровень до B. и так далее ...Сопоставление значений в новом столбце DataFrame

Уровень, Имя
0, А
1, В
2, С
1, D 2
, Е
3, F
3, G
1, B
2, C

Но я хочу что-то вроде ниже, с Name и Mother_name на той же строке:

Уровень, Имя, Mother_name
1, B, A
2, С, В
1, D, A
2, Е, D
3, F, Е
3, G E
1, B, A
2, C, B

+0

Можете ли вы полностью указать сопоставление 'Name -> Mother_name' (предпочтительнее со словарем)? –

+0

Спасибо, но я не думаю, что могу легко определить отображение (у вас есть какие-то подсказки, как я мог это сделать?).Список составляет ~ 7000 строк длиной до 10 уровней. Например, 'K' может иметь детей' D' и 'G'. У 'M' могут быть дети' D' и 'X'. Мать «D» в первом примере - «K», а во втором примере «X». Извините, если мое объяснение сбивает с толку. – Klabbedi

+0

Думаю, вам нужно вернуться к чертежной доске как по вашей схеме данных, так и по этому вопросу. Неясно, как вычисляется производный столбец. Размер кадра данных не имеет значения, если проблема правильно сформулирована. –

ответ

1

Если я понимаю формат правильно, родитель name зависит от ближайшего предыдущего ряда, чей level является один меньше текущей строкой level.

Ваш DataFrame имеет небольшое количество строк (~ 7000). Таким образом, есть небольшой вред (до производительности), просто повторяя строки. Если в DataFrame было очень большое значение , вы часто получаете более высокую производительность, если вы можете использовать операции Pandas с использованием столбцов вместо последовательной итерации. Однако в этом случае оказывается, что с использованием операций с поляризованными полями с использованием столбцов неудобно и чрезмерно сложно. Таким образом, я считаю, что лучший выбор здесь - это правильная итерация.

Использование df.iterrows для выполнения строк итерации, вы можете просто записывать текущие родитель для каждого уровня, как вы идете, и заполнить в «матерях» s в зависимости от обстоятельств:

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 
+0

Спасибо! Это решает мою проблему. – Klabbedi

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 
Смежные вопросы