python - Pandas 从多个分组操作中创建新的数据框

标签 python python-3.x pandas

我有一个 pandas 数据框

test = pd.DataFrame({'d':[1,1,1,2,2,3,3], 'id':[1,2,3,1,2,2,3], 'v1':[10, 20, 15, 35, 5, 10, 30], 'v2':[3, 4, 1, 6, 0, 2, 0], 'w1':[0.1, 0.3, 0.2, 0.1, 0.4, 0.3, 0.2], 'w2':[0.8, 0.1, 0.2, 0.3, 0.1, 0.1, 0.0]})


    d   id  v1  v2  w1  w2
0   1   1   10  3   0.10    0.80
1   1   2   20  4   0.30    0.10
2   1   3   15  1   0.20    0.20
3   2   1   35  6   0.10    0.30
4   2   2   5   0   0.40    0.10
5   3   2   10  2   0.30    0.10
6   3   3   30  0   0.20    0.00

我想按组获得一些加权值,例如

test['w1v1'] = test['w1'] * test['v1']
test['w1v2'] = test['w1'] * test['v2']
test['w2v1'] = test['w2'] * test['v1']
test['w2v2'] = test['w2'] * test['v2']

如何将结果很好地放入 df.看起来像的东西

test.groupby('id').sum()['w1v1'] / test.groupby('id').sum()['w1']

id
1   22.50
2   11.00
3   22.50

但包括每个加权值的列,就像

id   w1v1 w1v2 w2v1 w2v2
1   22.50  ...  ...  ...
2   11.00  ...  ...  ...
3   22.50  ...  ...  ...

有什么想法可以让我快速轻松地实现这一目标吗?

最佳答案

用途:

cols = ['w1v1','w1v2','w2v1','w2v2'] 
test1  =  (test[['w1', 'w2', 'w1', 'w2']] * test[['v1', 'v1', 'v2', 'v2']].values)
test1.columns = cols
print (test1)
   w1v1  w1v2  w2v1  w2v2
0   1.0   8.0   0.3   2.4
1   6.0   2.0   1.2   0.4
2   3.0   3.0   0.2   0.2
3   3.5  10.5   0.6   1.8
4   2.0   0.5   0.0   0.0
5   3.0   1.0   0.6   0.2
6   6.0   0.0   0.0   0.0

df = test.join(test1).groupby('id').sum()
df1  =  df[cols] / df[['w1', 'w2', 'w1', 'w2']].values
print (df1)
    w1v1       w1v2  w2v1      w2v2
id                                 
1   22.5  16.818182   4.5  3.818182
2   11.0  11.666667   1.8  2.000000
3   22.5  15.000000   0.5  1.000000

使用MultiIndex DataFrame的另一个更动态的解决方案:

a = ['v1', 'v2']
b = ['w1', 'w2']
mux = pd.MultiIndex.from_product([a,b])

df1 = test.set_index('id').drop('d', axis=1)
v = df1.reindex(columns=mux, level=0)
w = df1.reindex(columns=mux, level=1)

print (v)
    v1     v2   
    w1  w2 w1 w2
id              
1   10  10  3  3
2   20  20  4  4
3   15  15  1  1
1   35  35  6  6
2    5   5  0  0
2   10  10  2  2
3   30  30  0  0

print (w)
     v1        v2     
     w1   w2   w1   w2
id                    
1   0.1  0.8  0.1  0.8
2   0.3  0.1  0.3  0.1
3   0.2  0.2  0.2  0.2
1   0.1  0.3  0.1  0.3
2   0.4  0.1  0.4  0.1
2   0.3  0.1  0.3  0.1
3   0.2  0.0  0.2  0.0
<小时/>
df = w * v
print (df)
     v1         v2     
     w1    w2   w1   w2
id                     
1   1.0   8.0  0.3  2.4
2   6.0   2.0  1.2  0.4
3   3.0   3.0  0.2  0.2
1   3.5  10.5  0.6  1.8
2   2.0   0.5  0.0  0.0
2   3.0   1.0  0.6  0.2
3   6.0   0.0  0.0  0.0

df1 = df.groupby('id').sum() / w.groupby('id').sum()
#flatten MultiIndex columns
df1.columns = ['{0[1]}{0[0]}'.format(x) for x in df1.columns]
print (df1)
    w1v1       w2v1  w1v2      w2v2
id                                 
1   22.5  16.818182   4.5  3.818182
2   11.0  11.666667   1.8  2.000000
3   22.5  15.000000   0.5  1.000000

关于python - Pandas 从多个分组操作中创建新的数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47467249/

相关文章:

python - 在Mysql数据库中存储Python字典

python - 无法在 Mountain Lion 上导入 NumPy

python - 避免 Pandas DataFrame 中 for 循环的有效方法

python - 如何创建一个函数来查找列表中单词的索引?

python - 使用另一个数据帧替换数据帧中的空值

python - Pandas:根据多个其他列中的值填充空值

python - 列表理解内的可变范围

python - 如何将函数应用于 pandas 数据框中列中的每个值?

python - 如何使用pathlib获取Python中两个绝对路径之间的相对路径?

python - pd.DataFrame(数据,列= [])。如何传递带有嵌套字典的数据?