在可变长度数据帧上使用.sub()?

时间:2017-06-21 19:11:06

标签: python python-3.x pandas numpy

我需要计算数据框中一个静态列与构成数据帧其余部分的一些可变数量列之间的差异。

我的数据如下:

School District | 01-01-2017 | 01-02-2017 |...| 02-01-2017 | BaseData |
District A      |     1      |      5     |...|      3     |     1    |
District B      |     2      |      4     |...|      3     |     2    |
District C      |     3      |      3     |...|      3     |     3    |
District D      |     4      |      2     |...|      3     |     4    |    

我想从每个其他列中减去“BaseData”,其中的日期使得最终表格如下所示:

School District | 01-01-2017 | 01-02-2017 |...| 02-01-2017 | BaseData |
District A      |     0      |     -4     |...|     -2     |     0    |
District B      |     0      |     -2     |...|     -1     |     0    |
District C      |     0      |      0     |...|      0     |     0    |
District D      |     0      |      2     |...|      1     |     0    |

“学区”和“基础数据”之间的列数是可变的。我尝试使用finaltable = basetable[[1:-1]].sub(basetable['BaseData'], axis=0),但似乎[1:-1]不起作用(引发语法错误)。我知道我可以使用[1, 2, 3, etc.]返回任意数量的预选列,但表中的日期是动态的,可能有任意数量。

2 个答案:

答案 0 :(得分:1)

我认为你需要iloc来选择位置:

df.iloc[:, 1:] = df.iloc[:, 1:].sub(df['BaseData'], axis=0)
print (df)
  School District  01-01-2017  01-02-2017  02-01-2017  BaseData
0      District A           0           4           2         0
1      District B           0           2           1         0
2      District C           0           0           0         0
3      District D           0          -2          -1         0

或者:

df.iloc[:, 1:-1] = df.iloc[:, 1:-1].sub(df['BaseData'], axis=0)
print (df)
  School District  01-01-2017  01-02-2017  02-01-2017  BaseData
0      District A           0           4           2         1
1      District B           0           2           1         2
2      District C           0           0           0         3
3      District D           0          -2          -1         4

答案 1 :(得分:0)

我在发布后不久通过一个有点无关的问题找到了这个答案:

使用.columns()修饰符:

finaltable = basetable[basetable.columns[1:]].sub(basetable['BaseData'], axis=0)