У меня есть кусок кода, который работает нормально один, но когда я помещаю его в цикл (или использую метод 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 в цикле для циклов, и теперь код работает нормально. Хотя я «вроде» решил проблему, но я все еще очень смущен, почему это произойдет. Если кто-нибудь знает, почему, я бы очень признателен за ответ. Благодаря!
Пожалуйста, сообщите полную ошибку. – Julien