pandas做运算的一个坑!

问题描述

pandas实际开发中进行运算时的一个坑!


import pandas as pd

v = {'value': 'a'}
d = [{'name': 'abc', 'age': 10}, {'name': None, 'age': 11}, {'name': 'def', 'age': 9}]
df = pd.DataFrame(d)

new_1 = df[(df['age'] >= 10) | df['name'].str.contains(v['value'])]
new_2 = df[df['name'].str.contains(v['value']) | (df['age'] >= 10)]

print('-'*80)
print(df)

print('-'*80)
print(new_1)

print('-'*80)
print(new_2)

输出

--------------------------------------------------------------------------------
   age  name
0   10   abc
1   11  None
2    9   def
--------------------------------------------------------------------------------
   age  name
0   10   abc
1   11  None

--------------------------------------------------------------------------------
   age name
0   10  abc

想请问为什么 new1 和 new2的结果不一样?

阅读 1.6k
1 个回答
>>> df.dtypes
age      int64
name    object
dtype: object
>>> (df['age'] >= 10)
0     True
1     True
2    False
Name: age, dtype: bool
>>> df['name'].str.contains(v['value'])
0     True
1     None # 注意这个
2    False
Name: name, dtype: object
>>> (df['age'] >= 10) | df['name'].str.contains(v['value'])
0     True
1     True
2    False
dtype: bool
>>> df['name'].str.contains(v['value']) | (df['age'] >= 10)
0     True
1    False
2    False
dtype: bool

None 是python中的对象,不是pandas的数据类型,以python的规则进行运算
把None改为''.

>>> df2 = pd.DataFrame([{'name': 'abc', 'age': 10}, {'name': '', 'age': 11}, {'name': 'def', 'age': 9}])
>>> df2.dtypes
age      int64
name    object
dtype: object
>>> (df2['age'] >= 10)
0     True
1     True
2    False
Name: age, dtype: bool
>>> df2['name'].str.contains(v['value'])
0     True
1    False
2    False
Name: name, dtype: bool
>>> (df2['age'] >= 10) | df2['name'].str.contains(v['value'])
0     True
1     True
2    False
dtype: bool
>>> df2['name'].str.contains(v['value']) | (df2['age'] >= 10)
0     True
1     True
2    False
dtype: bool
>>> 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题