用numpy数组替换pandas DataFrame变量值

3 投票
1 回答
4594 浏览
提问于 2025-04-18 01:32

我正在对一个来自pandas数据框的变量进行转换,然后想用新的值替换掉原来的列。问题是,经过转换后,数组的长度和我的数据框索引的长度不一样。我觉得这不应该是这样。

>>> df['variable'] = stats.boxcox(df.variable)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Users\eMachine\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\frame.py", line 2119, in __setitem__
    self._set_item(key, value)
  File "C:\Users\eMachine\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\frame.py", line 2165, in _set_item
    value = self._sanitize_column(key, value)
  File "C:\Users\eMachine\WinPython-64bit-2.7.5.3\python-2.7.5.amd64\lib\site-packages\pandas\core\frame.py", line 2205, in _sanitize_column
    raise AssertionError('Length of values does not match '
AssertionError: Length of values does not match length of index

当我检查长度时,这两个长度似乎不一致。len(array)显示它的长度是2,但当我调用stats.boxcox时,它显示是50000。这到底是怎么回事呢?

>>> len(df)
50000
>>> len(stats.boxcox(df.variable))
2
>>> stats.boxcox(df.variable)
(0    -0.079496
1    -0.117982
2    -0.104637

...
49985    -0.041300
49986     0.651771
49987    -0.115660
49988    -0.118034
49998    -0.118014
49999    -0.034076
Name: feat9, Length: 50000, dtype: float64, 8.4721358117221772)
>>> 

1 个回答

11

在你的例子中,可以看到boxcox的结果是一个元组。这个和文档上说的一样,说明boxcox会返回一个包含转换后数据和一个lambda值的元组。注意文档页面上的例子,它是这样做的:

xt, _ = stats.boxcox(x)

这再次表明boxcox返回的是一个包含两个元素的元组。

你应该这样写:df['variable'] = stats.boxcox(df.variable)[0]

撰写回答