BUG: Binary operations with empty string arrays produce
See original GitHub issuePandas version checks
-
I have checked that this issue has not already been reported.
-
I have confirmed this bug exists on the latest version of pandas.
-
I have confirmed this bug exists on the main branch of pandas.
Reproducible Example
>>> import pandas as pd
>>> pd.DataFrame({'a': pd.Series([], dtype='str')}) + 1
Empty DataFrame
Columns: [a]
Index: []
>>> pd.DataFrame({'a': pd.Series([], dtype='str')}) | 1
Empty DataFrame
Columns: [a]
Index: []
>>> pd.DataFrame({'a': pd.Series([None], dtype='str')}) + 1
a
0 NaN
>>> pd.DataFrame({'a': pd.Series([None], dtype='str')}) | 1
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for |: 'NoneType' and 'int'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
...
TypeError: Cannot perform 'or_' with a dtyped [object] array and scalar of type [bool]
>>> pd.DataFrame({'a': pd.Series([None, 'a'], dtype='str')}) + 1
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
...
TypeError: can only concatenate str (not "int") to str
Issue Description
When a DataFrame contains a column of dtype object that is either empty or contains only None, it may allow certain binary operations to occur that would otherwise be invalid.
Expected Behavior
Errors should occur consistently across different binary operations between string columns and scalars based on the dtype of the scalar irrespective of whether that column is empty, contains only None, or contains actual strings.
Installed Versions
pd.show_versions()
INSTALLED VERSIONS
commit : 66e3805b8cabe977f40c05259cc3fcf7ead5687d python : 3.8.12.final.0 python-bits : 64 OS : Linux OS-release : 4.15.0-76-generic Version : #86-Ubuntu SMP Fri Jan 17 17:24:28 UTC 2020 machine : x86_64 processor : x86_64 byteorder : little LC_ALL : None LANG : None LOCALE : en_US.UTF-8
pandas : 1.3.5 numpy : 1.21.5 pytz : 2021.3 dateutil : 2.8.2 pip : 22.0.4 setuptools : 59.8.0 Cython : 0.29.28 pytest : 7.0.1 hypothesis : 6.39.3 sphinx : 4.4.0 blosc : None feather : None xlsxwriter : None lxml.etree : 4.8.0 html5lib : None pymysql : None psycopg2 : None jinja2 : 3.0.3 IPython : 8.1.1 pandas_datareader: None bs4 : 4.10.0 bottleneck : None fsspec : 2022.02.0 fastparquet : None gcsfs : None matplotlib : None numexpr : None odfpy : None openpyxl : None pandas_gbq : None pyarrow : 6.0.1 pyxlsb : None s3fs : None scipy : None sqlalchemy : None tables : None tabulate : None xarray : None xlrd : None xlwt : None numba : 0.55.1
Issue Analytics
- State:
- Created 2 years ago
- Comments:5 (3 by maintainers)
Top GitHub Comments
Yup, that all sounds right to me!
Gotcha, so it seems like you’re saying that the behavior of dtypes should not depend on content, which I absolutely agree with. Furthermore, I want to clarify: You are saying that performing a binary operation should work between two compatible columns according to their dtype (ex: integer column added to float column similar to the second commented example with two arrays added together) or that an operation between a column and a scalar value should be allowed if their dtypes are compatible, and that two incompatible dtypes should not work together (ex: integer added to a string as in your reproducible example) – is this correct?
In terms of proposed changes, I’m thinking of the following:
Let me know if I misunderstood anything.