在pandas DataFrame上进行就地逐行操作

时间:2013-11-08 07:18:24

标签: python pandas

假设我有这个:

>>> x = pandas.DataFrame([[1.0, 2.0, 3.0], [3, 4, 5]], columns=["A", "B", "C"])
>>> print x
   A  B  C
0  1  2  3
1  3  4  5

现在我想按行对x进行标准化 - 也就是说,将每行除以其总和。如this question中所述,可以使用x = x.div(x.sum(axis=1), axis=0)来实现。但是,这会创建一个 new DataFrame。如果我的DataFrame很大,那么在创建这个新的DataFrame时可以消耗大量内存,即使我立即将其分配给原始名称。

是否有一种有效的方法来执行此操作?我希望x.idiv()之类的内容提供axis的{​​{1}}选项,但会更新div。对于这个特定的情况,我需要划分,但有时为所有基本操作提供类似的就地版本也是很好的。

(我可以通过逐行迭代并将每个规范化的行分配回原始行来更新它,但这很慢,我正在寻找更有效的解决方案。)

1 个答案:

答案 0 :(得分:12)

您可以直接在numpy中执行此操作(无需创建副本):

In [11]: x1 = x.values.T

In [12]: x1
Out[12]: 
array([[ 1.,  3.],
       [ 2.,  4.],
       [ 3.,  5.]])

In [13]: x1 /= x1.sum(0)

In [14]: x
Out[14]: 
          A         B         C
0  0.166667  0.333333  0.500000
1  0.250000  0.333333  0.416667

也许div应该有一个inplace标志......?