空dataframe过滤行之后列名丢失了

一个按条件过滤pandas中行的函数,对于非空的dataframe可以正常工作,但是对于带列名的空的dataframe,过滤后的空datafram缺丢失了列名
问题复现如下:
In[5]:t1=pd.DataFrame(columns=['a','b'])
In[6]:t2=pd.DataFrame({'a':[-1,1],'b':[2,3]})
In[7]:t1
Out[7]:
EmptyDataFrame
Columns:[a,b]
Index:[]
In[8]:t2
Out[8]:
ab
0-12
113
In[13]:defmyfunc1(row):
...:ifrow.empty:
...:print(row)
...:returnTrue
...:ifint(row['a'])>0:
...:returnTrue
...:else:
...:returnFalse
...:
In[17]:t2[t2.apply(myfunc1,axis=1)]
Out[17]:
ab
113
In[18]:t1[t1.apply(myfunc1,axis=1)]
Series([],dtype:float64)
Out[18]:
EmptyDataFrame
Columns:[]
Index:[]
t2结果过滤得到row['a']>0的新dataframe,但是t1经过过滤为什么丢失了columns呢?因为后续处理要用到columns,所以我想知道
为什么丢失了columns
米脂
浏览 1058回答 2
2回答

Helenr

因为t1,t2内部的筛选条件不一样.t2内部条件其实是取第二行。In[18]:t2.apply(myfunc,axis=1)Out[18]:0False1Truedtype:boolIn[19]:t2[t2.apply(myfunc,axis=1)]Out[19]:ab113t1的内部条件则不同,没有True,False,是一个空的DataFrameIn[20]:t1.apply(myfunc,axis=1)Out[20]:Series([],dtype:float64)In[21]:t1[t1.apply(myfunc,axis=1)]Series([],dtype:float64)

元芳怎么了

感谢@everfigt还是不懂colums怎么丢的。。。t2的情况好理解,就是按true/false过滤,也就是说把空dataframe当成内部条件是没什么意义的吧?但是我尝试直接用空dataframe也是有结果的:In[11]:t2[pd.DataFrame()]Out[11]:ab0NaNNaN1NaNNaN另外,下面两种空dataframe过滤为什么会得到不同的结果呢:In[20]:t1.apply(myfunc,axis=1)Series([],dtype:float64)Out[20]:EmptyDataFrameColumns:[a,b]Index:[]In[21]:t1[t1.apply(myfunc,axis=1)]#为啥这里的colums丢了Series([],dtype:float64)In[13]:t1[pd.DataFrame()]#为啥直接失败了---------------------------------------------------------------------------ValueErrorTraceback(mostrecentcalllast)in()---->1t1[pd.DataFrame()]~/programs/venv36/lib/python3.6/site-packages/pandas/core/frame.pyin__getitem__(self,key)2133returnself._getitem_array(key)2134elifisinstance(key,DataFrame):->2135returnself._getitem_frame(key)2136elifis_mi_columns:2137returnself._getitem_multilevel(key)~/programs/venv36/lib/python3.6/site-packages/pandas/core/frame.pyin_getitem_frame(self,key)2217ifkey.values.sizeandnotis_bool_dtype(key.values):2218raiseValueError('MustpassDataFramewithbooleanvaluesonly')->2219returnself.where(key)22202221defquery(self,expr,inplace=False,**kwargs):~/programs/venv36/lib/python3.6/site-packages/pandas/core/generic.pyinwhere(self,cond,other,inplace,axis,level,errors,try_cast,raise_on_error)6128other=com._apply_if_callable(other,self)6129returnself._where(cond,other,inplace,axis,level,->6130errors=errors,try_cast=try_cast)61316132@Appender(_shared_docs['where']%dict(_shared_doc_kwargs,cond="False",~/programs/venv36/lib/python3.6/site-packages/pandas/core/generic.pyin_where(self,cond,other,inplace,axis,level,errors,try_cast)5889fordtincond.dtypes:5890ifnotis_bool_dtype(dt):->5891raiseValueError(msg.format(dtype=dt))58925893cond=cond.astype(bool,copy=False)ValueError:Booleanarrayexpectedforthecondition,notfloat64
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript