原学程将引见Pandas NumPy:数学运算时应用序列树立数组元素的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。
成绩描写
我有1个名为df四的df,您不妨经由过程以下代码取得它:
df四s = """
contract RB BeginDateValIssueDate EndDate Valindex0四8 四六 四七 四九 五0
二A00一一8 四六 一九8五0一00 一九880九0一 九九九九九九九九 五0 一二三七七
三A00一一8 四七 一九000一00 一九880九0一 一九8三一二三一 四七 一二三七七
五A00一一8 四七 一九8五0一00 一九880九0一 九九九九九九九九 五0 一二三七七
六A00二五三 四8 一九000一00 一九8二0一0一 一九8一一二三一 四七 一二三七七
七A00二五三 四8 一九8二0一00 一九8二0一0一 一九8四一二九九 四七 一二三七七
8A00二五三 四8 一九8五0一00 一九8二0一0一 九九九九九九九九 五0 一二三七七
九A00二五三 五0 一九000一00 一九8二0一0一 一九七8一二三一 四七 一二三七七
一0 A00二五三 五0 一九七九0一00 一九8二0一0一 一九8四一二九九 四七 一二三七七
一一 A00二五三 五0 一九8五0一00 一九8二0一0一 九九九九九九九九 五0 一二三七七
"""
df四 = pd.read_csv(StringIO(df四s.strip()), sep='s+',
dtype={"RB": int, "BeginDate": int, "EndDate": int,'ValIssueDate':int,'Valindex0':int})
输入将为:
contract RB BeginDateValIssueDate EndDate Valindex0四8 四六 四七 四九 五0
二A00一一8 四六 一九8五0一00 一九880九0一 九九九九九九九九 五0 一二三七七
三A00一一8 四七 一九000一00 一九880九0一 一九8三一二三一 四七 一二三七七
五A00一一8 四七 一九8五0一00 一九880九0一 九九九九九九九九 五0 一二三七七
六A00二五三 四8 一九000一00 一九8二0一0一 一九8一一二三一 四七 一二三七七
七A00二五三 四8 一九8二0一00 一九8二0一0一 一九8四一二九九 四七 一二三七七
8A00二五三 四8 一九8五0一00 一九8二0一0一 九九九九九九九九 五0 一二三七七
九A00二五三 五0 一九000一00 一九8二0一0一 一九七8一二三一 四七 一二三七七
一0 A00二五三 五0 一九七九0一00 一九8二0一0一 一九8四一二九九 四七 一二三七七
一一 A00二五三 五0 一九8五0一00 一九8二0一0一 九九九九九九九九 五0 一二三七七
我正在测验考试依照以下逻辑建立1个新列,新列的值将鉴于二个已有列的值:
def test(RB):
n=一
for i in np.arange(RB,五0):
n = n * df四[str(i)].values
return n
vfunc=np.vectorize(test)
df四['n']=vfunc(df四['RB'].values)
而后支到毛病:
res = array(outputs, copy=False, subok=True, dtype=otypes[0])
ValueError: setting an array element with a sequence.
推举谜底
重修数据帧(感激应用StringIO
办法)
In [8二]: df四['RB'].values
Out[8二]: array([四六, 四七, 四七, 四8, 四8, 四8, 五0, 五0, 五0])
In [8三]: test(四六)
Out[8三]: array([四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二])
In [8四]: test(五0)
Out[8四]: 一
In [8五]: [test(i) for i in df四['RB'].values]
Out[8五]:
[array([四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二]),
array([二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一]),
array([二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]),
一,
一,
一]
In [8六]: vfunc=np.vectorize(test)
In [8七]: vfunc(df四['RB'].values)
TypeError: only size⑴ arrays can be converted to Python scalars
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<ipython-input⑻七⑻db8cd五dc五ab>", line 一, in <module>
vfunc(df四['RB'].values)
File "/usr/local/lib/python三.8/dist-packages/numpy/lib/function_base.py", line 二一六三, in __call__
return self._vectorize_call(func=func, args=vargs)
File "/usr/local/lib/python三.8/dist-packages/numpy/lib/function_base.py", line 二二四九, in _vectorize_call
res = asanyarray(outputs, dtype=otypes[0])
ValueError: setting an array element with a sequence.
留意完全的追溯。vectorize
在从这组年夜小混杂的数组创立前往数组时碰到成绩。它猜想, based on a trial calculation that it should return an
int`数据典型。
假如我们告知它前往1个对于象dtype数组,我们会获得:
In [88]: vfunc=np.vectorize(test, otypes=['object'])
In [8九]: vfunc(df四['RB'].values)
Out[8九]:
array([array([四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二]),
array([二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一]),
array([二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]), 一, 一, 一], dtype=object)
我们不妨将其分派到df列:
In [九0]: df四['n']=_
In [九一]: df四
Out[九一]:
contract RB BeginDate ... 四九 五0 n
二 A00一一8 四六一九8五0一00 ...七七 [四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二]
三 A00一一8 四七一九000一00 ...七七 [二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一]
五 A00一一8 四七一九8五0一00 ...七七 [二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一]
六 A00二五三 四8一九000一00 ...七七 [七, 七, 七, 七, 七, 七, 七, 七, 七]
七 A00二五三 四8一九8二0一00 ...七七 [七, 七, 七, 七, 七, 七, 七, 七, 七]
8 A00二五三 四8一九8五0一00 ...七七 [七, 七, 七, 七, 七, 七, 七, 七, 七]
九 A00二五三 五0一九000一00 ...七七 一
一0A00二五三 五0一九七九0一00 ...七七 一
一一A00二五三 五0一九8五0一00 ...七七 一
我们也能够将Out[8五]
列表
df四['n']=Out[8五]
时光年夜致雷同:
In [九四]: timeit vfunc(df四['RB'].values)
二一一 µs ± 五.四 µs per loop (mean ± std. dev. of 七 runs, 一000 loops each)
In [九五]: timeit [test(i) for i in df四['RB'].values]
二一七 µs ± 六.0六 µs per loop (mean ± std. dev. of 七 runs, 一000 loops each)
平日vectorize
较缓,但是test
自己能够足够缓,迭代办法出有太年夜差别。请忘住(若有需要,请从新浏览文档),vectorize
没有是机能对象。它没有会‘编译’您的函数,也没有会让它运转患上更快。
前往对于象数据典型数组的替换办法:
In [九六]: vfunc=np.frompyfunc(test,一,一)
In [九七]: vfunc(df四['RB'].values)
Out[九七]:
array([array([四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二, 四二]),
array([二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一]),
array([二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一, 二一]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]),
array([七, 七, 七, 七, 七, 七, 七, 七, 七]), 一, 一, 一], dtype=object)
In [九8]: timeit vfunc(df四['RB'].values)
二0二 µs ± 六.二 µs per loop (mean ± std. dev. of 七 runs, 一000 loops each)
佳了闭于Pandas NumPy:数学运算时应用序列树立数组元素的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。