微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python-将熊猫数据框“应用于” dtype生成意外结果

玩具数据框:

>>> df = pd.DataFrame({'a': ['the', 'this'], 'b': [5, 2.3], 'c': [8, 11], 'd': ['the', 7]})

产量:

>>> df

      a    b   c    d
0   the  5.0   8  the
1  this  2.3  11    7

和:

>>> df.dtypes

a     object
b    float64
c      int64
d     object
dtype: object

问题陈述

但是我真正想做的是执行df.apply,以便如果该列/系列是字符串类型,则可以对列中的值执行一些操作.

所以我想我可以做些类似的事情:

>>> df.apply(lambda x: if x.dtype == 'object' and <the other check I care about>)

但是它没有按我预期的那样工作,一切都是对象.要验证,请尝试:

>>> df.apply(lambda x: x.dtype == 'object')
a    True
b    True
c    True
d    True
dtype: bool

为了了解发生了什么,我尝试了以下操作:

>>> def tmp_fn(val, typ):
...   if val.dtype == typ:
...     print(type(val))
...     print(val.dtype)

接着

>>> df.apply(lambda x: tmp_fn(x, 'object'))
<class 'pandas.core.series.Series'>
object
<class 'pandas.core.series.Series'>
object
<class 'pandas.core.series.Series'>
object
<class 'pandas.core.series.Series'>
object
a    None
b    None
c    None
d    None
dtype: object

试图理解

现在我知道发生了什么:熊猫系列正被解释为一个系列.似乎很容易解决.

但是,实际上,它不是在其他情况下正常工作的系列.例如,如果我尝试:

>>> df.a.dtype
dtype('O')

>>> df.b.dtype
dtype('float64')

它们都按照我的预期工作,并为我提供了系列中对象的类型,而不是简单的事实,即它是系列.

但是我想尝试一下,我想不出一种方法来在pandas.DataFrame.apply中复制相同的行为.这里发生了什么?如何获得该系列作品的正常播放?换句话说,我如何才能使pandas.DataFrame.apply完全像pandas.Series那样工作?我从不知道/直到现在为止,他们的行为并不完全相同.

解决方法:

您可以在.apply()中使用result_type =’expand’,类似列表的结果将变成列.您可以在docs中阅读更多内容

df.apply(lambda x: x.dtype, result_type='expand')

输出

a     object
b    float64
c      int64
d     object
dtype: object

如果没有result_type =’expand’:

df.apply(lambda x: print(x))

给出:

0     the
1    this
Name: a, dtype: object
0      5
1    2.3
Name: b, dtype: object
0     8
1    11
Name: c, dtype: object
0    the
1      7
Name: d, dtype: object

使用result_type =’expand’:

df.apply(lambda x: print(x), result_type='expand')

输出

0     the
1    this
Name: a, dtype: object
0    5.0
1    2.3
Name: b, dtype: float64
0     8
1    11
Name: c, dtype: int64
0    the
1      7
Name: d, dtype: object

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐