2016-12-12 8 views
0

次のように私は2つのデータフレームを持っているを使用して、同じ長さのベクトルを作成します。パイソン:2つのデータフレーム

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 

私の現在のスクリプトは、両方のデータフレームを追加し、ピボットテーブルを取得します。私の懸念は、この場合、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 
関連する問題