[PYTHON] Funktionen von pd.NA in Pandas 1.0.0 (rc0)

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.

einpacken

--pd.NA erscheint als Bedeutung des fehlenden Wertes. --pd.NA kann mit IntegerArray, BooleanArray, StringArray verwendet werden

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)

Typen in pd.Series, pd.DataFrame

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

pow Funktion

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

Angegeben von read_csv

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

Der Grund, warum ich überhaupt gelernt habe

Ich habe es durch einen Retweet von jemandem auf Twitter bemerkt

https://mobile.twitter.com/jorisvdbossche/status/1208476049690046465 スクリーンショット 2020-01-13 8.49.57.png

einpacken

--pd.NA erscheint als Bedeutung des fehlenden Wertes. --pd.NA kann mit IntegerArray, BooleanArray, StringArray verwendet werden

Schließlich

Wenn Sie diese Art von verrückter Geschichte lieben, besuchen Sie uns bitte bei justInCase. https://www.wantedly.com/companies/justincase


Referenz-URL

Überprüfungsumgebung

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

Funktionen von pd.NA in Pandas 1.0.0 (rc0)
Zusammenfassung der häufig verwendeten Methoden bei Pandas
Zusammenfassung dessen, was bei 100 Pandas-Schlägen verwendet wurde (# 1 ~ # 32)
Der Header ist falsch ausgerichtet mit read_csv () und read_table () von Pandas
Sprechen Sie über die Funktionen, für die Pandas und ich im Projekt verantwortlich waren
Lerne Pandas in 10 Minuten
UnicodeDecodeError in pandas read_csv
Grundlegende Bedienung von Pandas
Installieren von Python 3.3 rc1
Funktionen der Go-Sprache
Hauptfunktionen von ChainMap
"Typfehler: Nicht erkannter Werttyp: <class'str '>" in to_datetime von Pandas
Vergleich der Datenrahmenbehandlung in Python (Pandas), R, Pig
So erhalten Sie einen Überblick über Ihre Daten in Pandas
Umgang mit Zitaten in [bash]
Teilweise bei Problemen
Merkmale der Programmiersprache [Memo]
Liste der Knoten in Diagrammen
Objektäquivalenzbeurteilung in Python
Zusammenfassung der grundlegenden Verwendung von Pandas
Verhalten der Pandas Rolling () Methode
Implementierung der schnellen Sortierung in Python
Über die Funktionen von Python
Index der Verwendung bestimmter Pandas
Tauschen Sie Spalten in Pandas-Datenrahmen aus
Die Kraft der Pandas: Python
[Endlich ein großes Update] Ich habe verschiedene Updates von Pandas 1.0.0rc überprüft