Python:使用两个DataFrame

时间:2016-12-12 00:57:56

标签: python pandas

我有两个数据帧如下:

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)

1 个答案:

答案 0 :(得分: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