Python:使用两个数据帧创建相同长度的向量

2024-10-02 20:33:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数据帧,如下所示:

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)

Tags: 数据iddataframevaluetypegroup类别person
1条回答
网友
1楼 · 发布于 2024-10-02 20:33:56
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

相关问题 更多 >