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)
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 |
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]
}
)
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)
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)
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)
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)
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
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.]])
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)
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.]])
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 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)
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)