update1 2020-01-25: Es wurde hinzugefügt, dass das fehlerhafte Verhalten ein Fehler war
Ab 2020-01-13 wurde pandas 1.0.0rc0 veröffentlicht, aber eines der Hauptmerkmale ist die Einführung von "pd.NA" als fehlender Wert. Ich werde diese Eigenschaft zusammenfassen und wie man sie benutzt.
Haftungsausschluss: Es wurde bestätigt, mit Pandas 1.0.0 rc0 zu arbeiten, und es besteht eine gute Möglichkeit, dass sich dies in Zukunft ändern wird.
Schließlich Verifizierungsumgebung.
--pd.NA
erscheint als Bedeutung des fehlenden Wertes.
--pd.NA
kann mit IntegerArray, BooleanArray, StringArray verwendet werden
pd.NA
kann der fehlende Wert in der Klasse int ausgedrückt werden (keine unachtsame Konvertierung in float).
--pd.NA
ist ein Singleton-Objekt und stimmt mit allen Datentypen überein.Boolean
funktioniert nicht in rc0 und befasst sich mit Problemen). Sie können ~~ angeben, aber boolean
führt zu einem Fehler. Es ist nicht bekannt, ob dieses Verhalten ein Fehler oder eine Spezifikation ist. (Wahrscheinlich Spezifikationen) ~~data type
Eine neue Klasse namens "NAType" wird in Pandas eingeführt. Der Zweck besteht darin, den Wert als fehlenden Wert anzugeben.
>>> import pandas as pd
>>> pd.NA
<NA>
>>> type(pd.NA)
<class 'pandas._libs.missing.NAType'>
Wenn Sie in pd.Series und pd.DataFrame keinen Typ angeben, wird dieser als Objekttyp behandelt, und wenn Sie ihn angeben, wird er als dieser Typ behandelt. Beachten Sie, dass "Int64Dtype" eine nullfähige Interger ist (ein ExtensionDtype für int64-Integer-Daten. Array von Integer-Werten (optional fehlende Werte)), die aus Pandas 0.24 eingeführt wurden. Beachten Sie, dass Sie dtype in Großbuchstaben "Int64" anstelle von "int64" angeben müssen. Technisch gesehen ermöglichte die Einführung von "Pandas Extension Arrays" die Verwendung von ExtensionDType.
>>> pd.Series([pd.NA]).dtype
dtype('O') # O means Object
#Der dtype kann entweder als String-Alias oder als Typ selbst angegeben werden. Das Folgende wird als Zeichenfolge angegeben.
>>> pd.Series([pd.NA], dtype="Int64").dtype
Int64Dtype()
>>> pd.Series([pd.NA], dtype="boolean").dtype
BooleanDtype
>>> pd.Series([pd.NA], dtype="string").dtype
StringDtype
Klicken Sie hier für die Implementierung von NAType
.
https://github.com/pandas-dev/pandas/blob/493363ef60dd9045888336b5c801b2a3d00e976d/pandas/_libs/missing.pyx#L335-L485
Interessanterweise wird der Hash-Wert durch "2 ** 61 - 1 == 2305843009213693951" definiert. Es gibt kein Problem, da kein Konflikt mit dem Schlüssel des Wörterbuchs besteht. Es ist nicht mit "pd.NA" verwandt, aber tatsächlich geht der Hash von Ganzzahlwerten in Python mit "2 ** 61 -1" um.
>>> hash(pd.NA) == 2 ** 61 -1
True
>>> {pd.NA: "a", 2305843009213693951: "b"}
{<NA>: 'a', 2305843009213693951: 'b'}
>>> (hash(2**61 - 2), hash(2**61 - 1), hash(2**61))
(2305843009213693950, 0, 1)
Die Typbestimmung muss in Großbuchstaben "Int64" anstelle von "int64" angegeben werden.
>>> pd.Series([1, 2]) + pd.Series([pd.NA, pd.NA])
0 <NA>
1 <NA>
dtype: object
>>> pd.Series([1, 2]) + pd.Series([pd.NA, pd.NA], dtype="Int64")
0 <NA>
1 <NA>
dtype: Int64
Die Angabe von "int64" führt zu einem Fehler.
>>> pd.Series([pd.NA], dtype="int64").dtype
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/pandas/core/series.py", line 304, in __init__
data = sanitize_array(data, index, dtype, copy, raise_cast_failure=True)
File "/usr/local/lib/python3.7/site-packages/pandas/core/construction.py", line 438, in sanitize_array
subarr = _try_cast(data, dtype, copy, raise_cast_failure)
File "/usr/local/lib/python3.7/site-packages/pandas/core/construction.py", line 535, in _try_cast
subarr = maybe_cast_to_integer_array(arr, dtype)
File "/usr/local/lib/python3.7/site-packages/pandas/core/dtypes/cast.py", line 1502, in maybe_cast_to_integer_array
casted = np.array(arr, dtype=dtype, copy=copy)
TypeError: int() argument must be a string, a bytes-like object or a number, not 'NAType'
Das Ergebnis der Operation mit Booleschem Verhalten verhält sich genauso wie Julias "vermisst" und Rs "NA".
>>> pd.Series([True, False, pd.NA]) & True
0 True
1 False
2 NA
dtype: bool
>>> pd.Series([True, False, pd.NA]) | True
0 True
1 True
2 True
dtype: bool
>>> pd.NA & True
NA
>>> pd.NA & False
False
>>> pd.NA | True
True
>>> pd.NA | False
NA
>>> pd.Series([1, 2, pd.NA], dtype="Int64")
0 1
1 2
2 <NA>
dtype: Int64
>>> pd.Series([True, False, pd.NA], dtype="boolean")
0 True
1 False
2 <NA>
dtype: boolean
Das Ergebnis der Summenoperation ist "NA" propagiert (propagieren), aber "pd.Series.sum ()" ohne Argument wird als "0" behandelt und nicht propagiert. Es ist notwendig, "sum (skipna = False)" anzugeben, um es als Propagate zu behandeln. Bei Angabe des Typs von "Int64" wurde jedoch "np.nan" anstelle von "NA" ausgegeben. ~~ Ich habe nach einem Problem gesucht, um festzustellen, ob dies das erwartete Verhalten oder ein Fehler war, aber es war unklar. Also habe ich rücksichtslos ein [Issue Ticket] erstellt (https://github.com/pandas-dev/pandas/issues/30958). ~~ Ticket ausstellen Importiert. Es scheint sich in rc1 zu widerspiegeln.
>>> sum([1, pd.NA])
<NA>
# pd.Series object
>>> pd.Series([1, pd.NA])
0 1
1 <NA>
dtype: object
>>> pd.Series([1, pd.NA]).sum()
1
>>> pd.Series([1, pd.NA]).sum(skipna=False)
<NA>
# pd.Series Int64
>>> pd.Series([1, pd.NA], dtype='Int64')
0 1
1 <NA>
dtype: Int64
>>> pd.Series([1, pd.NA], dtype='Int64').sum()
1
>>> pd.Series([1, pd.NA], dtype='Int64').sum(skipna=False)
nan
Der Umgang mit Kräften steht im Einklang mit Rs NA_integer_. Das Verhalten von Julia ist ein Rätsel.
>>> pd.NA ** 0
1
>>> 1 ** pd.NA
1
>>> -1 ** pd.NA
-1
> R.version.string
[1] "R version 3.6.1 (2019-07-05)"
> NA_integer_ ^ 0L
[1] 1
> 1L ^ NA_integer_
[1] 1
> -1L ^ NA_integer_
[1] -1
julia> VERSION
v"1.3.1"
julia> missing ^ 0
missing
julia> 1 ^ missing
missing
julia> -1 ^ missing
missing
Experimentieren Sie mit der folgenden CSV-Datei. (test.csv
)
X_int,X_bool,X_string
1,True,"a"
2,False,"b"
NA,NA,"NA"
Das Verhalten ist das gleiche wie bei Pandas 0.25.3 ohne Angabe von dtype.
>>> df1 = pd.read_csv("test.csv")
>>> df1
X_int X_bool X_string
0 1.0 True a
1 2.0 False b
2 NaN NaN NaN
>>> df1.dtypes
X_int float64
X_bool object
X_string object
dtype: object
Für dtype können Int64
und string
angegeben werden.
#dtype kann anstelle des Zeichenliteral die folgende Typklasse sein.
# df2 = pd.read_csv("test.csv", dtype={'X_int': pd.Int64Dtype(), 'X_string': pd.StringDtype()})
>>> df2 = pd.read_csv("test.csv", dtype={'X_int': 'Int64', 'X_string': 'string'})
>>> df2
X_int X_bool X_string
0 1 True a
1 2 False b
2 <NA> NaN <NA>
>>> df2.dtypes
X_int Int64
X_bool object
X_string string
dtype: object
Auf der anderen Seite schlägt das Lesen als boolesche NA fehl, selbst wenn "boolean" "pd.BooleanDtype ()" angegeben ist. Natürlich ist die Angabe von "bool" auch ein Fehler. Problem Als ich es meldete, wurde es erfolgreich importiert. Es scheint gut mit rc1 zu funktionieren.
>>> df3 = pd.read_csv("test.csv", dtype={'X_bool': 'boolean'})
Traceback (most recent call last):
File "pandas/_libs/parsers.pyx", line 1191, in pandas._libs.parsers.TextReader._convert_with_dtype
File "/usr/local/lib/python3.7/site-packages/pandas/core/arrays/base.py", line 232, in _from_sequence_of_strings
raise AbstractMethodError(cls)
pandas.errors.AbstractMethodError: This method must be defined in the concrete class type
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 676, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 454, in _read
data = parser.read(nrows)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 1133, in read
ret = self._engine.read(nrows)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 2037, in read
data = self._reader.read(nrows)
File "pandas/_libs/parsers.pyx", line 859, in pandas._libs.parsers.TextReader.read
File "pandas/_libs/parsers.pyx", line 874, in pandas._libs.parsers.TextReader._read_low_memory
File "pandas/_libs/parsers.pyx", line 951, in pandas._libs.parsers.TextReader._read_rows
File "pandas/_libs/parsers.pyx", line 1083, in pandas._libs.parsers.TextReader._convert_column_data
File "pandas/_libs/parsers.pyx", line 1114, in pandas._libs.parsers.TextReader._convert_tokens
File "pandas/_libs/parsers.pyx", line 1194, in pandas._libs.parsers.TextReader._convert_with_dtype
NotImplementedError: Extension Array: <class 'pandas.core.arrays.boolean.BooleanArray'> must implement _from_sequence_of_strings in order to be used in parser methods
>>> df3 = pd.read_csv("test.csv", dtype={'X_bool': pd.BooleanDtype()})
Traceback (most recent call last):
File "pandas/_libs/parsers.pyx", line 1191, in pandas._libs.parsers.TextReader._convert_with_dtype
File "/usr/local/lib/python3.7/site-packages/pandas/core/arrays/base.py", line 232, in _from_sequence_of_strings
raise AbstractMethodError(cls)
pandas.errors.AbstractMethodError: This method must be defined in the concrete class type
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 676, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 454, in _read
data = parser.read(nrows)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 1133, in read
ret = self._engine.read(nrows)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 2037, in read
data = self._reader.read(nrows)
File "pandas/_libs/parsers.pyx", line 859, in pandas._libs.parsers.TextReader.read
File "pandas/_libs/parsers.pyx", line 874, in pandas._libs.parsers.TextReader._read_low_memory
File "pandas/_libs/parsers.pyx", line 951, in pandas._libs.parsers.TextReader._read_rows
File "pandas/_libs/parsers.pyx", line 1083, in pandas._libs.parsers.TextReader._convert_column_data
File "pandas/_libs/parsers.pyx", line 1114, in pandas._libs.parsers.TextReader._convert_tokens
File "pandas/_libs/parsers.pyx", line 1194, in pandas._libs.parsers.TextReader._convert_with_dtype
NotImplementedError: Extension Array: <class 'pandas.core.arrays.boolean.BooleanArray'> must implement _from_sequence_of_strings in order to be used in parser methods
>>> df3 = pd.read_csv("test.csv", dtype={'X_bool': 'bool'})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 676, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 454, in _read
data = parser.read(nrows)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 1133, in read
ret = self._engine.read(nrows)
File "/usr/local/lib/python3.7/site-packages/pandas/io/parsers.py", line 2037, in read
data = self._reader.read(nrows)
File "pandas/_libs/parsers.pyx", line 859, in pandas._libs.parsers.TextReader.read
File "pandas/_libs/parsers.pyx", line 874, in pandas._libs.parsers.TextReader._read_low_memory
File "pandas/_libs/parsers.pyx", line 951, in pandas._libs.parsers.TextReader._read_rows
File "pandas/_libs/parsers.pyx", line 1083, in pandas._libs.parsers.TextReader._convert_column_data
File "pandas/_libs/parsers.pyx", line 1114, in pandas._libs.parsers.TextReader._convert_tokens
File "pandas/_libs/parsers.pyx", line 1231, in pandas._libs.parsers.TextReader._convert_with_dtype
ValueError: Bool column has NA values in column 1
(Eindruck) Der Schuldige war nur, dass der fehlende Wert nicht in numpy existierte. Es gibt also verschiedene Inkonsistenzen in der Einführung auf der Pandas-Ebene. Hier werden verschiedene Dinge geschrieben. https://dev.pandas.io/docs/user_guide/gotchas.html#why-not-make-numpy-like-r
Ich habe es durch einen Retweet von jemandem auf Twitter bemerkt
https://mobile.twitter.com/jorisvdbossche/status/1208476049690046465
--pd.NA
erscheint als Bedeutung des fehlenden Wertes.
--pd.NA
kann mit IntegerArray, BooleanArray, StringArray verwendet werden
pd.NA
kann der fehlende Wert in der Klasse int ausgedrückt werden (keine unachtsame Konvertierung in float).
--pd.NA
ist ein Singleton-Objekt und stimmt mit allen Datentypen überein.pd.read_csv ()
können Sie Int64
und string
angeben, aber boolean
führt zu einem Fehler. Es ist nicht bekannt, ob dieses Verhalten ein Fehler oder eine Spezifikation ist. (Wahrscheinlich Spezifikationen)Wenn Sie diese Art von verrückter Geschichte lieben, besuchen Sie uns bitte bei justInCase. https://www.wantedly.com/companies/justincase
Ich habe es auf Docker bestätigt.
FROM python:3.7.6
WORKDIR /home
RUN pip install pandas==1.0.0rc0
CMD ["/bin/bash"]
$ docker build -t pdna .
$ docker run -it --rm -v $(pwd):/home/ pdna
Inside Docker
root@286578c2496b:/home# cat /etc/issue
Debian GNU/Linux 10 \n \l
root@286578c2496b:/home# uname -a
Linux 286578c2496b 4.9.184-linuxkit #1 SMP Tue Jul 2 22:58:16 UTC 2019 x86_64 GNU/Linux
root@286578c2496b:/home# python -c "import pandas as pd; pd.show_versions()"
INSTALLED VERSIONS
------------------
commit : None
python : 3.7.6.final.0
python-bits : 64
OS : Linux
OS-release : 4.9.184-linuxkit
machine : x86_64
processor :
byteorder : little
LC_ALL : None
LANG : C.UTF-8
LOCALE : en_US.UTF-8
pandas : 1.0.0rc0
numpy : 1.18.1
pytz : 2019.3
dateutil : 2.8.1
pip : 19.3.1
setuptools : 44.0.0
Cython : None
pytest : None
hypothesis : None
sphinx : None
blosc : None
feather : None
xlsxwriter : None
lxml.etree : None
html5lib : None
pymysql : None
psycopg2 : None
jinja2 : None
IPython : None
pandas_datareader: None
bs4 : None
bottleneck : None
fastparquet : None
gcsfs : None
lxml.etree : None
matplotlib : None
numexpr : None
odfpy : None
openpyxl : None
pandas_gbq : None
pyarrow : None
pytables : None
pytest : None
s3fs : None
scipy : None
sqlalchemy : None
tables : None
tabulate : None
xarray : None
xlrd : None
xlwt : None
xlsxwriter : None
numba : None
Recommended Posts