如何从一个数字中减去一个pandas DataFrame的每一行?

时间:2014-10-01 02:03:56

标签: python pandas dataframe subtraction

说我有一个DataFrame:

ds = pd.DataFrame(np.abs(randn(3, 4)), index=[1,2,3], columns=['A','B','C','Average'])
ds
      A         B         C      Average
1  1.099679  0.042043  0.083903  0.410128
2  0.268205  0.718933  1.459374  0.758887
3  0.680566  0.538655  0.038236  1.169403

如何用第1行中的平均值减去(并用结果替换)第一行中的A,B和C?

2 个答案:

答案 0 :(得分:2)

一种相对简单的方法是使用sub方法(我假设Average始终是最后一列):

ds[ds.columns[:-1]].sub(ds.Average, axis=0)

执行以下操作:

  • ds[ds.columns[:-1]]是一个DataFrame,其中包含Average的最后一列(ds)以外的所有内容。

  • .sub(ds.Average, axis=0)从DataFrame中的相应行中减去Average列中的行值。

要更改原始ds,请务必将ds的相关列重新绑定到值的新DataFrame:

ds[ds.columns[:-1]] = ds[ds.columns[:-1]].sub(ds.Average, axis=0)

答案 1 :(得分:1)

怎么样

ds['A'] = ds['A'] - ds['Average']
ds['B'] = ds['B'] - ds['Average']
ds['C'] = ds['C'] - ds['Average']

熊猫很容易就是这样!

哦,这适用于整个DF。你只希望它为第一排是对的吗?

ds.loc[1, 'A'] = ds.loc[1, 'A'] - ds.loc[1, 'Average']
ds.loc[1, 'B'] = ds.loc[1, 'B'] - ds.loc[1, 'Average']
ds.loc[1, 'C'] = ds.loc[1, 'C'] - ds.loc[1, 'Average']

或循环:

for col in ['A', 'B', 'C']:
    ds.loc[1, col] = df.loc[1, col] - ds.loc[1, 'Average']

依旧......

如果您有数千列,那么只需:

for col in ds.columns:
    ds[col] = ds[col] - ds['Average']