-
-
Notifications
You must be signed in to change notification settings - Fork 18.4k
BUG: many dataframe operations broken when a column contains numpy structured array #60108
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
also worth mentioning the problems go away if you allow the structured array to have an object dtype e.g. import numpy as np
import pandas as pd
N = 10
df = pd.DataFrame(data={'other_stuff':np.zeros(N)})
idx = [0, 1]
hash_dtype = np.dtype([(f'h{i}', np.uint64) for i in range(4)])
df.loc[idx, 'hashes'] = np.ones(len(idx), dtype=hash_dtype)
# here df['hashes'] coerced to object data type |
Thanks for the report. Indeed, pandas does not support NumPy structured arrays. I do not think it is feasible to support these. |
Should we rather error when a user creates such a Series with an unsupported dtype, instead of allowing to create it but then fail later on in various confusing ways? Or is there enough that works that people would want to use a Series/DataFrame container with such data? |
For sure it would be helpful to fail earlier, it took me a while to figure out what led to creating this issue. My workaround was to view the numpy array as bytes. In my example the structured type is 32 bytes and Is there any trick where pandas could do a similar thing, just treat structured arrays as opaque "element is N bytes" or even internally storing as a |
I'm +1 on failing in the constructor.
I don't think this should happen silently. |
I was thinking more in terms of something pandas could do internally, but I don't know the internals for why it trips on structured types or if this is a practical idea. For example maybe some bookkeeping happens so that internally pandas sees a ndarray.view of dtype('S{item size}') but to the user it appears like their custom data type.
|
If this were possible, would essentially any operation other than getting, setting, and reshaping just raise? E.g. groupby.sum. I'm quite negative on partial support for a dtype like this. |
Similar to #55011 I think |
Another similar bug report in #42739, with a masked structured array, where for this case the DataFrame constructor already fails, although it could use a more informative error message.
Currently gives |
Pandas 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
Issue Description
Working with a numpy array with a structured type consisting of four 64 bit integers, there are various errors when getting/setting the associated data in a dataframe.
df.loc[idx, 'hashes'] =
get LossySetitemError, AssertionError: Something has gone wrongdf['hashes'].values[idx] =
(but for other indexes would have to do something likedf['hashes'].values[df.index.isin(idx)] =
or usedf.index.get_indexer
)print(df)
andprint(df['hashes'])
df[['hashes', 'other_stuff']]
TypeError: void() takes at least 1 positional argument (0 given)Expected Behavior
can set values with
.loc
without assertion errorcan print dataframe without exception
Installed Versions
INSTALLED VERSIONS
commit : 0691c5c
python : 3.12.7
python-bits : 64
OS : Linux
OS-release : 6.6.57-1-lts
Version : #1 SMP PREEMPT_DYNAMIC Thu, 17 Oct 2024 13:57:25 +0000
machine : x86_64
processor :
byteorder : little
LC_ALL : None
LANG : en_US.UTF-8
LOCALE : en_US.UTF-8
pandas : 2.2.3
numpy : 2.1.2
pytz : 2024.2
dateutil : 2.9.0.post0
pip : 24.2
Cython : 3.0.11
sphinx : None
IPython : 8.28.0
adbc-driver-postgresql: None
adbc-driver-sqlite : None
bs4 : 4.12.3
blosc : None
bottleneck : None
dataframe-api-compat : None
fastparquet : None
fsspec : None
html5lib : None
hypothesis : None
gcsfs : None
jinja2 : None
lxml.etree : 5.3.0
matplotlib : 3.9.2
numba : None
numexpr : None
odfpy : None
openpyxl : 3.1.5
pandas_gbq : None
psycopg2 : None
pymysql : None
pyarrow : None
pyreadstat : None
pytest : None
python-calamine : None
pyxlsb : None
s3fs : None
scipy : 1.14.1
sqlalchemy : None
tables : None
tabulate : None
xarray : None
xlrd : 2.0.1
xlsxwriter : 3.1.9
zstandard : 0.22.0
tzdata : 2024.2
qtpy : 2.4.1
pyqt5 : None
The text was updated successfully, but these errors were encountered: