例
玩具数据框:
>>> 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 举报,一经查实,本站将立刻删除。