2016-05-12 2 views
0

Что самый простой способ перехода от этого (кадр данных):Создать новую эталонную dataframe

Project Folder Owner value1 values2 
    A  B  C  100 200 
    A  B  C  500 400 
    D  E  F  100 200 
    D  E  F  300 400 

к этому:

referenceID value1 values2 
    1    100 200 
    1    500 400 
    2    100 200 
    2    300 400 

и второй кадр данных с:

referenceID Project Folder Owner 
1    A  B  C 
2    D  E  F 

Я, однако, об использовании кодировщика меток, но для этого мне потребуется объединить «Проект, папку и владельца» в новое поле - это нормально. поскольку я сохраняю оргиналы, но, похоже, лишняя ненужная работа.

ответ

0

Вы можете создать второй блок данных с группой по оригиналу с использованием Project, Folder и Owner. Затем создайте список уникальных значений индекса и передайте их в новый фреймворк данных. Если предположить, что исходные данные в виде dataframe имени ДФ:

df2 = df.groupby(['Project', 'Folder', 'Owner']).agg('sum') 
df3 = pd.DataFrame([list(df2.index.unique().tolist()[x]) for x in range(len(df2.index.unique().tolist()))], columns=df2.index.name) 
df3.insert(0, 'ReferenceId', df3.index + 1) 

Результат будет выглядеть следующим образом (нужной второй dataframe):

ReferenceId Project Folder Owner 
0 1   A  B  C 
1 2   D  E  F 
0

Это будет генерировать вывод, который вы ищете.

m = [['A', 'B', 'C', 100, 200], 
    ['A', 'B', 'C', 500, 400], 
    ['D', 'E', 'F', 100, 200], 
    ['D', 'E', 'F', 300, 400]] 

owner = {} 
for row in m: 
    key = tuple(row[:3]) 
    if key in owner: 
     owner[key].append(row[3:]) 
    else: 
     owner[key] = [row[3:]] 

frame1 = [] 
frame2 = [] 
for i, key in enumerate(owner): 
    frame2.append([i] + list(key)) 
    for row in owner[key]: 
     frame1.append([i] + list(row)) 


print frame1 
print frame2 
+0

Использование pandas будет более эффективным и удобным для чтения – ysearka

+0

Согласен. Но вы делаете предположение, что пользователь знаком с пандами. Мое решение зависит только от стандартной библиотеки. – jgrant

+0

Да, я упоминал о кадре данных на вопрос. Я не проголосовал за вас по телефону – Diego

-1

Для того, чтобы выбрать столбцы, если вы знаете номер столбца, используйте встроенный звонок, otherway использование .ix метод:

%timeit df.loc[:,['value1','values2']] 
out: 1000 loops, best of 3: 602 µs per loop 

%timeit df[[3,4]] 
out: 1000 loops, best of 3: 295 µs per loop 

%timeit df.ix[:,['value1','values2']] 
1000 loops, best of 3: 412 µs per loop 

Что касается GroupBy, а просто использовать groupby:

df.groupby(['Project','Folder','Owner'],as_index = False).sum().drop(['value1','values2'],1) 
+0

, где находится referenceID? и как вы обновляете исходный фрейм данных? – Diego

Смежные вопросы