从DataFrame中减去Series,同时保持DataFrame结构不变

时间:2013-12-11 23:17:41

标签: python pandas numpy dataframe

如何在保持DataFrame结构完整的同时从DataFrame中减去Series?

df = pd.DataFrame(np.zeros((5,3)))
s = pd.Series(np.ones(5))

df - s
   0  1  2   3   4
0 -1 -1 -1 NaN NaN
1 -1 -1 -1 NaN NaN
2 -1 -1 -1 NaN NaN
3 -1 -1 -1 NaN NaN
4 -1 -1 -1 NaN NaN

我想要的是相当于从DataFrame中减去一个标量

df - 1
   0  1  2
0 -1 -1 -1
1 -1 -1 -1
2 -1 -1 -1
3 -1 -1 -1
4 -1 -1 -1

3 个答案:

答案 0 :(得分:11)

也许:

>>> df = pd.DataFrame(np.zeros((5,3)))
>>> s = pd.Series(np.ones(5))
>>> df.sub(s,axis=0)
   0  1  2
0 -1 -1 -1
1 -1 -1 -1
2 -1 -1 -1
3 -1 -1 -1
4 -1 -1 -1

[5 rows x 3 columns]

或者,对于一个更有趣的例子:

>>> s = pd.Series(np.arange(5))
>>> df.sub(s,axis=0)
   0  1  2
0  0  0  0
1 -1 -1 -1
2 -2 -2 -2
3 -3 -3 -3
4 -4 -4 -4

[5 rows x 3 columns]

答案 1 :(得分:1)

如果a1是由n列组成的数据帧,而a2是仅由1列组成的另一个数据帧,则可以使用numpy从a1的每个列中减去a2

np.subtract(a1, a2)

如果a2是Series并确保转换为DataFrame,则可以实现相同的结果

np.subtract(a1, a2.to_frame()) 

我猜想,在计算此操作之前,您需要确保两个数据帧中的索引一致/重叠。实际上,如果a1和a2具有相同的行数和不同的索引,则上述操作将起作用。你可以尝试

a1 = pd.DataFrame([[1, 2], [3, 4]], columns=['a','b'])
a2 = pd.DataFrame([[1], [2]], columns=['c'])

np.subtract(a1, a2)

a1 = pd.DataFrame([[1, 2], [3, 4]], columns=['a','b'])
a2 = pd.DataFrame([[1], [2]], columns=['c'], index=[3,4])

np.subtract(a1,a2)

将给您相同的结果。

由于这个原因,要确保两个DataFrame是连贯的,您可以使用以下方法进行预处理:

def align_dataframes(df1, df2):
    r = pd.concat([df1, df2], axis=1, join_axes=[df1.index])
    return r.loc[:,df1.columns], r.loc[:,df2.columns]

答案 2 :(得分:0)

我将举一个修改DataFrame子集的示例

df = pd.DataFrame(np.arange(20).reshape((2,10)),columns=list('abcdefghjk'))

>>> df
    a   b   c   d   e   f   g   h   j   k
0   0   1   2   3   4   5   6   7   8   9
1  10  11  12  13  14  15  16  17  18  19

# Series to be subtracted    
dif = df['g'] - df['h']

>>> dif
0   -1
1   -1
dtype: int32

# subtract the Series from columns 'g','h','j','k'
df.loc[:,'g':] = df.loc[:,'g':].subtract(dif,axis='rows')
#df.loc[:,'g':] = df.loc[:,'g':].subtract(dif,axis=0)

>>> df
    a   b   c   d   e   f   g   h   j   k
0   0   1   2   3   4   5   7   8   9  10
1  10  11  12  13  14  15  17  18  19  20