2016-08-15 3 views
2

У меня есть кусок кода, который работает нормально один, но когда я помещаю его в цикл (или использую метод df.apply()), он не Работа. Код:(код Python не работает в цикле) pandas.DataFrame.apply() не работает в цикле

import pandas as pd 
from functools import partial 
datadf=pd.DataFrame(data,columns=['X1','X2']) 
for i in datadf.index.values.tolist(): 
    row=datadf.loc[i] 
    x1=row['X1'] 
    x2=row['X2'] 
    set1=set([x1,x2]) 
    links=data2[data2['Xset']==set1] 
    df1=pd.DataFrame(range(1,11),columns=['year']) 
    def idlist1(row,var1): 
     year=row['year'] 
     id1a=links[(links['xx1']==var1) & (links['year']==year)] 
     id1a=id1a['id1'].values.tolist() 
     id1b=links[(links['xx2']==var1) & (links['year']==year)] 
     id1b=id1b['id2'].values.tolist() 
     id1=list(set(id1a+id1b)) 
     return id1 
    df1['id1a']=df1.apply(partial(idlist1,var1=x1),axis=1) 
    #...(do other stuffs to return a value using "df1") 
    del df1 

Здесь data2 еще один dataframe. Здесь я пытаюсь сопоставить значения (x1,x2) с data2. Код отлично работает за пределами цикла, под которым я подразумеваю, я указываю непосредственно (x1,x2). Но когда я поставил код в цикле или использовать df.apply, я всегда получаю сообщение об ошибке

ValueError: could not broadcast input array from shape (0) into shape (1) 

Я не понимаю, почему. Может ли кто-нибудь помочь? Благодаря! (кстати, версия pandas является 0.18.0.) Сообщение полная ошибка:

File "<ipython-input-229-541c0f3a4d2f>", line 19, in <module> 
df1['id1a']=df1.apply(partial(idlist1,var1=x1),axis=1) 

File "/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 4042, in apply 
return self._apply_standard(f, axis, reduce=reduce) 

File "/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 4155, in _apply_standard 
result = self._constructor(data=results, index=index) 

File "/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 223, in __init__ 
mgr = self._init_dict(data, index, columns, dtype=dtype) 

File "/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 359, in _init_dict 
return _arrays_to_mgr(arrays, data_names, index, columns, dtype=dtype) 

File "/anaconda2/lib/python2.7/site-packages/pandas/core/frame.py", line 5250, in _arrays_to_mgr 
return create_block_manager_from_arrays(arrays, arr_names, axes) 

File "/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 3933, in create_block_manager_from_arrays 
construction_error(len(arrays), arrays[0].shape, axes, e) 

File "/anaconda2/lib/python2.7/site-packages/pandas/core/internals.py", line 3895, in construction_error 
raise e 

ValueError: could not broadcast input array from shape (0) into shape (1) 

Update: Я узнал, что метод df.apply каким-то образом не совместим с петлей, поэтому я преобразовал все в apply 's в цикле для циклов, и теперь код работает нормально. Хотя я «вроде» решил проблему, но я все еще очень смущен, почему это произойдет. Если кто-нибудь знает, почему, я бы очень признателен за ответ. Благодаря!

+0

Пожалуйста, сообщите полную ошибку. – Julien

ответ

1

Возможно, существует множество определений row, один из которых является аргументом функции def idlist1(row,var1):, а другой - row=datadf.loc[i]. Вы можете попробовать переименовать его и посмотреть, помогает ли он.

+0

Спасибо, что ответили. Но я попробовал, и переименование не работает. – user18243nanana

+0

@ user18243 хорошо .. трудно повезло, я не могу обойтись без знания значений переменных, может быть, вы можете добавить некоторые правдоподобные данные, закодированные вручную и опубликованные? (и я думаю, есть большой шанс, что вы получите ошибку, пока вы это делаете :) – dontloo

+0

Как вы и предположили, я пробовал код с некоторыми искусственно сконструированными данными, и цикл работает. Поэтому я думал, что это проблема с данными. Но затем я «перевел» часть 'def' и' apply' внутри цикла в другой цикл и работает с исходными данными. Теперь я действительно смущен. – user18243nanana

Смежные вопросы