当索引匹配时,通过系列中的值减去数据帧行中的所有列

时间:2019-03-11 19:49:07

标签: python-3.x pandas dataframe

我正在尝试从DataFrame的行中所有在list中具有匹配索引的列中减去1。

例如,如果我有一个像这样的DataFrame:

df = pd.DataFrame({'AMOS Admin': [1,1,0,0,2,2], 'MX Programs': [0,0,1,1,0,0], 'Material Management': [2,2,2,2,1,1]})

print(df)
       AMOS Admin  MX Programs  Material Management
0           1            0                    2
1           1            0                    2
2           0            1                    2
3           0            1                    2
4           2            0                    1
5           2            0                    1

我想从索引在[2,3]中的所有列中减去1,以便最终结果是:

    AMOS Admin  MX Programs  Material Management
0           1            0                    2
1           1            0                    2
2          -1            0                    1
3          -1            0                    1
4           2            0                    1
5           2            0                    1

我找不到创建此系列的方法:

sr = pd.Series([1,1], index=['2', '3'])
print(sr)
2    1
3    1
dtype: int64

但是,按照this question应用子方法会导致DataFrame的所有NaN和新行都位于底部。

    AMOS Admin  MX Programs Material Management
0   NaN         NaN         NaN
1   NaN         NaN         NaN
2   NaN         NaN         NaN
3   NaN         NaN         NaN
4   NaN         NaN         NaN
5   NaN         NaN         NaN
2   NaN         NaN         NaN
3   NaN         NaN         NaN

任何帮助将不胜感激。

谢谢, 胡安

2 个答案:

答案 0 :(得分:1)

reindex一起使用sr,然后使用values减去

df.loc[:]=df.values-sr.reindex(df.index,fill_value=0).values[:,None]
df
Out[1117]: 
   AMOS Admin  MX Programs  Material Management
0           1            0                    2
1           1            0                    2
2          -1            0                    1
3          -1            0                    1
4           2            0                    1
5           2            0                    1

答案 1 :(得分:0)

如果您想做的是特定的,为什么不这样做:

df.loc[[2, 3], :] = df.loc[[2, 3], :].subtract(1)