融化大熊猫中的分类列

时间:2018-07-20 16:19:19

标签: python python-3.x pandas

我正在尝试从名为out的数据帧创建以下名为df的数据帧。我有一个非常手动且缓慢的方法,但是我希望可以将groupby()melt()

组合使用
import pandas as pd
import itertools

def expand_grid(data_dict):
   rows = itertools.product(*data_dict.values())
   return pd.DataFrame.from_records(rows, columns=data_dict.keys())

data_dict = dict(
    id1 = list('ab'),
    id2 = list('cd'),
    col1 = list('ef'),
    col2 = list('gh'),
    col3 = list('ij'),
)

df = expand_grid(data_dict)
df['value'] = range(1,33)

out = pd.melt(df.drop('value', axis=1), id_vars=['id1', 'id2'], var_name='col', value_name='level')
out = out.drop_duplicates().reset_index()

myvals = []
for r in out.index:
    out_row = out.loc[r]
    df_sub = df.loc[(df.id1 == out_row[1]) & (df.id2 == out_row[2]) & (df[out_row[3]] == out_row[4])]
    myvals.append(df_sub.value.sum())

out['value'] = myvals

谢谢!

1 个答案:

答案 0 :(得分:2)

使用meltgroupby

df.melt(
    ['id1', 'id2', 'value'],
    ['col1', 'col2', 'col3'],
    value_name='level', var_name='col'
).groupby(['id1', 'id2', 'col', 'level'], as_index=False).sum()

   id1 id2   col level  value
0    a   c  col1     e     10
1    a   c  col1     f     26
2    a   c  col2     g     14
3    a   c  col2     h     22
4    a   c  col3     i     16
5    a   c  col3     j     20
6    a   d  col1     e     42
7    a   d  col1     f     58
8    a   d  col2     g     46
9    a   d  col2     h     54
10   a   d  col3     i     48
11   a   d  col3     j     52
12   b   c  col1     e     74
13   b   c  col1     f     90
14   b   c  col2     g     78
15   b   c  col2     h     86
16   b   c  col3     i     80
17   b   c  col3     j     84
18   b   d  col1     e    106
19   b   d  col1     f    122
20   b   d  col2     g    110
21   b   d  col2     h    118
22   b   d  col3     i    112
23   b   d  col3     j    116