从其他特定于数据帧的行中减去DataFrame行

时间:2016-01-28 17:53:38

标签: python pandas

我必须在每行中有一个数据框df我有一些我想要进行减法的列,columns_to_sub,一些名为'吸收'以及一些我不想改变的专栏。我想将columns_to_sub的值减去另一个数据帧上的一行,并由标记'吸收'编制索引。这是我想要的一个非功能性的例子:

import pandas as pd
import numpy as np
data = np.hstack((np.random.randint(0,10,20).reshape(-1,1),np.random.rand(20,3)))
df = pd.DataFrame(data,columns=['absorb','a','b','c'])
columns_to_sub = ['a','b']

means = df.groupby('absorb')[columns_to_sub].mean()
#This result is not what I want, because the subtraction is strange
df[columns_to_sub] = df[columns_to_sub] - means.loc[df.absorb,columns_to_sub]

如何修复此代码?

2 个答案:

答案 0 :(得分:2)

你太近了。只需在values上使用means

df[columns_to_sub] = df[columns_to_sub] - means.loc[df.absorb,columns_to_sub].values
>>> df
    absorb         a         b         c
0        2 -0.060540 -0.270233  0.416213
1        9  0.597084  0.136158  0.415023
2        1 -0.131393 -0.535288  0.158465
3        3  0.282902 -0.008801  0.872598
4        9 -0.236306 -0.337588  0.297589
5        6  0.000000  0.000000  0.283559
6        3  0.022021 -0.110693  0.671295
7        7  0.042000 -0.327157  0.736395
8        1  0.097912  0.119899  0.409241
9        1 -0.460052  0.280302  0.341200
10       1  0.002855 -0.013902  0.648113
11       1  0.490679  0.148989  0.626300
12       8  0.000000  0.000000  0.986039
13       3 -0.304923  0.119494  0.553210
14       0  0.000000  0.000000  0.626576
15       5  0.000000  0.000000  0.105102
16       2 -0.166760 -0.122624  0.750912
17       2  0.227300  0.392857  0.498822
18       7 -0.042000  0.327157  0.323361
19       9 -0.360778  0.201430  0.521043

答案 1 :(得分:0)

如果将'absorb'设置为df上的索引,则减法将很简单。尽管吸收是一种非唯一的索引,但请确保这是您想要的。

data = np.hstack((np.random.randint(0,10,20).reshape(-1,1),np.random.rand(20,3)))
df = pd.DataFrame(data,columns=['absorb','a','b','c']).set_index('absorb')
df.head()

               a         b         c
absorb                              
8       0.942156  0.675819  0.606406
0       0.801685  0.360899  0.055210
7       0.540333  0.691493  0.580708
7       0.234766  0.446549  0.295496
4       0.942021  0.338729  0.827124

迄今为止dfabsorb索引。

然后,means

columns_to_sub = ['a','b']
​
means = df.groupby(level=0)[columns_to_sub].mean()
means.head()
               a         b
absorb                    
0       0.871498  0.659507
1       0.113925  0.711533
2       0.485379  0.191867
4       0.557054  0.581740

然后可以这样做减法:

result = df[columns_to_sub] -  means[columns_to_sub]
result.head()
               a         b
absorb                    
0      -0.069813 -0.298608
0       0.069813  0.298608
1       0.000000  0.000000
2       0.451854  0.164074
2      -0.451854 -0.164074
相关问题