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

发布于 2022-09-07 22:59:31 字数 916 浏览 19 评论 0

一个按条件过滤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]:
Empty DataFrame
Columns: [a, b]
Index: []

In [8]: t2
Out[8]:
   a  b
0 -1  2
1  1  3


In [13]: def myfunc1(row):
    ...:     if row.empty:
    ...:         print(row)
    ...:         return True
    ...:     if int(row['a'])>0:
    ...:         return True
    ...:     else:
    ...:         return False
    ...:


In [17]: t2[t2.apply(myfunc1, axis=1)]
Out[17]:
   a  b
1  1  3

In [18]: t1[t1.apply(myfunc1, axis=1)]
Series([], dtype: float64)
Out[18]:
Empty DataFrame
Columns: []
Index: []

t2结果过滤得到row['a']>0的新dataframe,
但是t1经过过滤为什么丢失了columns呢?
因为后续处理要用到columns,所以我想知道

为什么丢失了columns

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡看悲欢离合 2022-09-14 22:59:31

因为t1,t2内部的筛选条件不一样.
t2内部条件其实是取第二行。

In [18]: t2.apply(myfunc, axis=1)
Out[18]: 
0    False
1     True
dtype: bool

In [19]: t2[t2.apply(myfunc, axis=1)]
Out[19]: 
   a  b
1  1  3

t1的内部条件则不同,没有True,False,是一个空的DataFrame

In [20]: t1.apply(myfunc, axis=1)
Out[20]: Series([], dtype: float64)

In [21]: t1[t1.apply(myfunc, axis=1)]
Series([], dtype: float64)
手长情犹 2022-09-14 22:59:31

感谢@everfigt

还是不懂colums怎么丢的。。。
t2的情况好理解,就是按true/false过滤,也就是说把空dataframe当成内部条件是没什么意义的吧?
但是我尝试直接用空dataframe也是有结果的:

In [11]: t2[pd.DataFrame()]
Out[11]:
    a   b
0 NaN NaN
1 NaN NaN

另外,下面两种空dataframe过滤为什么会得到不同的结果呢:

In [20]: t1.apply(myfunc, axis=1)
Series([], dtype: float64)
Out[20]: 
Empty DataFrame
Columns: [a, b]
Index: []

In [21]: t1[t1.apply(myfunc, axis=1)]  # 为啥这里的colums丢了
Series([], dtype: float64)
In [13]: t1[pd.DataFrame()]  # 为啥直接失败了
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-13-c296ac7af466> in <module>()
----> 1 t1[pd.DataFrame()]

~/programs/venv36/lib/python3.6/site-packages/pandas/core/frame.py in __getitem__(self, key)
   2133             return self._getitem_array(key)
   2134         elif isinstance(key, DataFrame):
-> 2135             return self._getitem_frame(key)
   2136         elif is_mi_columns:
   2137             return self._getitem_multilevel(key)

~/programs/venv36/lib/python3.6/site-packages/pandas/core/frame.py in _getitem_frame(self, key)
   2217         if key.values.size and not is_bool_dtype(key.values):
   2218             raise ValueError('Must pass DataFrame with boolean values only')
-> 2219         return self.where(key)
   2220
   2221     def query(self, expr, inplace=False, **kwargs):

~/programs/venv36/lib/python3.6/site-packages/pandas/core/generic.py in where(self, cond, other, inplace, axis, level, errors, try_cast, raise_on_error)
   6128         other = com._apply_if_callable(other, self)
   6129         return self._where(cond, other, inplace, axis, level,
-> 6130                            errors=errors, try_cast=try_cast)
   6131
   6132     @Appender(_shared_docs['where'] % dict(_shared_doc_kwargs, cond="False",

~/programs/venv36/lib/python3.6/site-packages/pandas/core/generic.py in _where(self, cond, other, inplace, axis, level, errors, try_cast)
   5889             for dt in cond.dtypes:
   5890                 if not is_bool_dtype(dt):
-> 5891                     raise ValueError(msg.format(dtype=dt))
   5892
   5893         cond = cond.astype(bool, copy=False)

ValueError: Boolean array expected for the condition, not float64
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文