2016-12-12 2 views
0

У меня есть два dataframes следующим образом:Python: Создание векторов одинаковой длины с помощью двух DataFrames

d1 = {'person' : ['1', '1', '1', '2', '2', '3', '3', '4', '4'], 
    'category' : ['A', 'B', 'C', 'B', 'D', 'E', 'F', 'F', 'D'], 
    'value' : [2, 3, 1, 2, 1, 4, 2, 1, 3]} 

d2 = {'group' : [100, 100, 100, 200, 200, 300, 300], 
    'category' : ['A', 'D', 'F', 'B', 'C', 'A', 'F'], 
    'value' : [10, 8, 8, 6, 7, 8, 5]} 

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

Каков наилучший способ для этого? Это пример того, что мне нужно:

 id type A B C D E F 
0 100 group 10 0 0 8 0 8 
1 200 group 0 6 7 0 0 0 
2 300 group 8 0 0 0 0 5 
3  1 person 2 3 1 0 0 0 
4  2 person 0 2 0 1 0 0 
5  3 person 0 0 0 0 4 2 
6  4 person 0 0 0 3 0 1 

Мой текущий скрипт добавляет оба dataframes, а затем он получает сводную таблицу. Меня беспокоит то, что в этом случае типы столбцов id различны.

Я делаю это, потому что иногда не все категории находятся в каждом кадре данных (например, «E» не находится в df2).

Это то, что у меня есть:

import pandas as pd 

d1 = {'person' : ['1', '1', '1', '2', '2', '3', '3', '4', '4'], 
    'category' : ['A', 'B', 'C', 'B', 'D', 'E', 'F', 'F', 'D'], 
    'value' : [2, 3, 1, 2, 1, 4, 2, 1, 3]} 

d2 = {'group' : [100, 100, 100, 200, 200, 300, 300], 
    'category' : ['A', 'D', 'F', 'B', 'C', 'A', 'F'], 
    'value' : [10, 8, 8, 6, 7, 8, 5]} 

df1 = pd.DataFrame(d1) 
df2 = pd.DataFrame(d2) 

df1['type'] = 'person' 
df2['type'] = 'group' 

df1.rename(columns={'person': 'id'}, inplace = True) 
df2.rename(columns={'group': 'id'}, inplace = True) 

rawpivot = pd.DataFrame([]) 
rawpivot = rawpivot.append(df1) 
rawpivot = rawpivot.append(df2) 

pivot = rawpivot.pivot_table(index=['id','type'], columns='category', values='value', aggfunc='sum', fill_value=0) 
pivot.reset_index(inplace = True) 

ответ

0
import pandas as pd 

d1 = {'person' : ['1', '1', '1', '2', '2', '3', '3', '4', '4'], 
    'category' : ['A', 'B', 'C', 'B', 'D', 'E', 'F', 'F', 'D'], 
    'value' : [2, 3, 1, 2, 1, 4, 2, 1, 3]} 

d2 = {'group' : [100, 100, 100, 200, 200, 300, 300], 
    'category' : ['A', 'D', 'F', 'B', 'C', 'A', 'F'], 
    'value' : [10, 8, 8, 6, 7, 8, 5]} 

cols = ['idx', 'type', 'A', 'B', 'C', 'D', 'E', 'F'] 
df1 = pd.DataFrame(columns=cols) 

def add_data(type_, data): 
    global df1 
    for id_, category, value in zip(data[type_], data['category'], data['value']): 
     if id_ not in df1.idx.values: 
      row = pd.DataFrame({'idx': id_, 'type': type_}, columns = cols, index=[0]) 
      df1 = df1.append(row, ignore_index = True) 
     df1.loc[df1['idx']==id_, category] = value 

add_data('group', d2) 
add_data('person', d1) 
df1 = df1.fillna(0) 

df1 теперь занимает следующие значения

idx type A B C D E F 
0 100 group 10 0 0 8 0 8 
1 200 group 0 6 7 0 0 0 
2 300 group 8 0 0 0 0 5 
3 1 person 2 3 1 0 0 0 
4 2 person 0 2 0 1 0 0 
5 3 person 0 0 0 0 4 2 
6 4 person 0 0 0 3 0 1 
Смежные вопросы