Mémo Pandas ~ Aucun, np.nan, sur les caractères vides ~

Mémo Pandas ~ Aucun, np.nan, sur les caractères vides ~

J'étais accro à None, np.nan of pandas, so personal notes

L'environnement vérifié est le suivant (il n'y avait aucune différence dans les résultats)

Résumé

None np.nan Caractères vides
Conversion DataFrame np sauf lorsque l'objet n'est pas spécifié pour dtype.Converti en nan np.np car nan ne peut pas être converti en int.Les colonnes contenant nan sont essentiellement de type float Type de caractère(Non numérique)Comme il est traité comme, il n'est pas traité comme une valeur manquante et la colonne contenant des caractères vides devient le type d'objet de base.
read_csv - Np quel que soit le type de dtype spécifié pour les caractères vides et vides sur csv.Lire comme nan -
fillna, fropna Jugé comme une valeur manquante Jugé comme une valeur manquante Non jugé comme une valeur manquante
groupby Jugé comme valeur manquante et ignoré Jugé comme valeur manquante et ignoré Non jugé comme une valeur manquante

résultat de l'inspection

Conversion de DataFrame en spécifiant dtype

Vérification de la façon dont le type de colonne change lorsque les données suivantes sont spécifiées avec différents dtypes


df = pd.DataFrame(
    {
        #Rangée A: int+None
        "A": [1, 2, 3, None],
        #Colonne B: str+Caractères vides
        "B": ["1", "2", "3", ""],
        #Colonne C: int+np.nan
        "C": [1, 2, 3, np.nan],
        #Colonne D:int seulement
        "D": [1, 2, 3, 4]
    }
)

dtype non spécifié

Aucun ne semble être converti en np.nan ... Parallèlement à cela, la colonne contenant np.nan devient float64


df = pd.DataFrame(
    {
        "A": [1, 2, 3, None],
        "B": ["1", "2", "3", ""],
        "C": [1, 2, 3, np.nan],
        "D": [1, 2, 3, 4]
    }
)

print(df)

     A  B    C  D
0  1.0  1  1.0  1
1  2.0  2  2.0  2
2  3.0  3  3.0  3
3  NaN     NaN  4

print(df.dtypes)

A    float64
B     object
C    float64
D      int64
dtype: object

print(df.values)

array([[1.0, '1', 1.0, 1],
       [2.0, '2', 2.0, 2],
       [3.0, '3', 3.0, 3],
       [nan, '', nan, 4]], dtype=object)

Spécifier l'objet

Toutes les valeurs n'ont pas changé, aucune ne reste telle quelle


df = pd.DataFrame(
    {
        "A": [1, 2, 3, None],
        "B": ["1", "2", "3", ""],
        "C": [1, 2, 3, np.nan],
        "D": [1, 2, 3, 4]
    },
    dtype=object
)

print(df)

      A  B    C  D
0     1  1    1  1
1     2  2    2  2
2     3  3    3  3
3  None     NaN  4

print(df.dtypes)

A    object
B    object
C    object
D    object
dtype: object

print(df.values)

array([[1, '1', 1, 1],
       [2, '2', 2, 2],
       [3, '3', 3, 3],
       [None, '', nan, 4]], dtype=object)

Spécifier le flotteur

Les caractères vides ne peuvent pas être modifiés en flottants, seules les colonnes contenant des caractères vides deviennent le type d'objet


df = pd.DataFrame(
    {
        "A": [1, 2, 3, None],
        "B": ["1", "2", "3", ""],
        "C": [1, 2, 3, np.nan],
        "D": [1, 2, 3, 4]
    },
    dtype=float
)

print(df)

      A  B    C  D
0     1  1    1  1
1     2  2    2  2
2     3  3    3  3
3  None     NaN  4

print(df.dtypes)

A    float64
B     object
C    float64
D    float64
dtype: object

print(df.values)

array([[1.0, '1', 1.0, 1.0],
       [2.0, '2', 2.0, 2.0],
       [3.0, '3', 3.0, 3.0],
       [nan, '', nan, 4.0]], dtype=object)

Spécifiez int

Les colonnes qui ne peuvent pas être converties en int64 (colonnes contenant np.nan ou None) seront de type object


df = pd.DataFrame(
    {
        "A": [1, 2, 3, None],
        "B": ["1", "2", "3", ""],
        "C": [1, 2, 3, np.nan],
        "D": [1, 2, 3, 4]
    },
    dtype=int
)

print(df)

      A  B    C  D
0     1  1    1  1
1     2  2    2  2
2     3  3    3  3
3  None     NaN  4

print(df.dtypes)

A    object
B    object
C    object
D     int64
dtype: object

print(df.values)

array([[1, '1', 1, 1],
       [2, '2', 2, 2],
       [3, '3', 3, 3],
       [None, '', nan, 4]], dtype=object)

read_csv avec dtype spécifié

Vérifiez ce qui arrive au type de colonne lorsque le csv suivant est spécifié avec différents dtypes

sample.csv


#Rangée A: int+Ciel
#Colonne B:Chaîne+Caractères vides
#Colonne C: float+Ciel
#Colonne D:int seulement
A,B,C,D
1,"1",1.0,1
2,"2",2.0,2
3,"3",3.0,3
,"",,4

dtype non spécifié

Les caractères vides et vides sont lus comme np.nan, et int est converti en float en conséquence.


df = pd.read_csv("sample.csv")

print(df)

     A    B    C  D
0  1.0  1.0  1.0  1
1  2.0  2.0  2.0  2
2  3.0  3.0  3.0  3
3  NaN  NaN  NaN  4

print(df.dtypes)

A    float64
B    float64
C    float64
D      int64
dtype: object

print(df.values)

array([[ 1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.],
       [nan, nan, nan,  4.]])

Spécifier l'objet

Les caractères vides et vides sont convertis en np.nan, mais les autres valeurs sont converties en type str


df = pd.read_csv("sample.csv", dtype=object)

print(df)

     A    B    C  D
0    1    1  1.0  1
1    2    2  2.0  2
2    3    3  3.0  3
3  NaN  NaN  NaN  4

print(df.dtypes)

A    object
B    object
C    object
D    object
dtype: object

print(df.values)

array([['1', '1', '1.0', '1'],
       ['2', '2', '2.0', '2'],
       ['3', '3', '3.0', '3'],
       [nan, nan, nan, '4']], dtype=object)

Spécifier le flotteur

Toutes les colonnes sont converties en type float64


df = pd.read_csv("sample.csv", dtype=float)

print(df)

     A    B    C    D
0  1.0  1.0  1.0  1.0
1  2.0  2.0  2.0  2.0
2  3.0  3.0  3.0  3.0
3  NaN  NaN  NaN  4.0

print(df.dtypes)

A    float64
B    float64
C    float64
D    float64
dtype: object

print(df.values)

array([[ 1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.],
       [nan, nan, nan,  4.]])

Spécifiez int

Puisque les caractères vides et vides sont convertis en np.nan, ils ne peuvent pas être lus comme int et une erreur se produit.


df = pd.read_csv("sample.csv", dtype=int)

ValueError: Integer column has NA values in column 0

Comportement à fillna et dropna

Comportement lors du remplissage des données suivantes


df = pd.DataFrame(
    {
        #Rangée A: int+None
        "A": [1, 2, 3, None],
        #Colonne B: str+Caractères vides
        "B": ["1", "2", "3", ""],
        #Colonne C: int+np.nan
        "C": [1, 2, 3, np.nan],
        #Colonne D:int seulement
        "D": [1, 2, 3, 4]
    },
    dtype="object"
)

print(df.values)

array([[1, '1', 1, 1],
       [2, '2', 2, 2],
       [3, '3', 3, 3],
       [None, '', nan, 4]], dtype=object)

Si vous faites df.fillna ('FILL'), les valeurs de None et np.nan seront converties, mais les caractères vides resteront.


print(df.fillna('FILL'))

      A  B     C  D
0     1  1     1  1
1     2  2     2  2
2     3  3     3  3
3  FILL     FILL  4

print(df.fillna('FILL').values)

array([[1, '1', 1, 1],
       [2, '2', 2, 2],
       [3, '3', 3, 3],
       ['FILL', '', 'FILL', 4]], dtype=object)

De même, le comportement au moment de dropna est que les lignes et les colonnes contenant np.nan et None sont supprimées, mais les caractères vides ne sont pas traités comme des valeurs manquantes.


print(df.dropna(axis=1))

   B  D
0  1  1
1  2  2
2  3  3
3     4

print(df.dropna(axis=1).values)

array([['1', 1],
       ['2', 2],
       ['3', 3],
       ['', 4]], dtype=object)

Comportement lors du groupement

Effectuer la vérification à l'aide de la trame de données suivante


df = pd.DataFrame(
    {
        #Rangée A: int+None
        "A": [1, 2, 3, None],
        #Colonne B: str+Caractères vides
        "B": ["1", "2", "3", ""],
        #Colonne C: int+np.nan
        "C": [1, 2, 3, np.nan],
        #Colonne D:int seulement
        "D": [1, 2, 3, 4]
    },
    dtype="object"
)

Lors du regroupement dans une colonne contenant None, np.nan, les lignes de None, np.nan sont ignorées (manquantes).


print(df.groupby("A").max().reset_index())

   A  B  C  D
0  1  1  1  1
1  2  2  2  2
2  3  3  3  3

print(df.groupby("A").max().reset_index().values)

array([[1, '1', 1, 1],
       [2, '2', 2, 2],
       [3, '3', 3, 3]], dtype=object)

print(df.groupby("C").max().reset_index())

   C  A  B  D
0  1  1  1  1
1  2  2  2  2
2  3  3  3  3

print(df.groupby("C").max().reset_index().values)

array([[1, 1, '1', 1],
       [2, 2, '2', 2],
       [3, 3, '3', 3]], dtype=object)

Si la colonne contient des caractères vides, elle ne sera pas ignorée


print(df.groupby("B").max().reset_index())

   B    A    C  D
0     NaN  NaN  4
1  1  1.0  1.0  1
2  2  2.0  2.0  2
3  3  3.0  3.0  3

print(df.groupby("B").max().reset_index().values)

array([[1, 1, '1', 1],
       [2, 2, '2', 2],
       [3, 3, '3', 3]], dtype=object)

Recommended Posts

Mémo Pandas ~ Aucun, np.nan, sur les caractères vides ~
Mémo Pandas
mémo pandas
Mémo inversé Pandas
8rep --Code de suppression de chaîne Pandas
Mémo de visualisation par pandas, seaborn