Ich war süchtig nach None, np.nan von Pandas, also persönlichen Notizen
Die verifizierte Umgebung ist wie folgt (es gab keinen Unterschied in den Ergebnissen)
None | np.nan | Leerer Charakter | |
---|---|---|---|
DataFrame-Konvertierung | np außer wenn für dtype kein Objekt angegeben ist.In Nan umgewandelt | np.np weil nan nicht in int umgewandelt werden kann.Säulen, die nan enthalten, sind grundsätzlich Float-Säulen | Zeichentyp(Nicht numerisch)Da es als behandelt wird, wird es nicht als fehlender Wert behandelt, und die Spalte mit leeren Zeichen wird zum grundlegenden Objekttyp. |
read_csv | - | Np unabhängig davon, welcher dtype für leere und leere Zeichen in csv angegeben ist.Lesen Sie als nan | - |
fillna, fropna | Als fehlender Wert beurteilt | Als fehlender Wert beurteilt | Nicht als fehlender Wert beurteilt |
groupby | Als fehlender Wert beurteilt und ignoriert | Als fehlender Wert beurteilt und ignoriert | Nicht als fehlender Wert beurteilt |
Überprüfung, wie sich der Spaltentyp ändert, wenn die folgenden Daten mit unterschiedlichen dtypes angegeben werden
df = pd.DataFrame(
{
#Zeile A.: int+None
"A": [1, 2, 3, None],
#Spalte B.: str+Leerer Charakter
"B": ["1", "2", "3", ""],
#Spalte C.: int+np.nan
"C": [1, 2, 3, np.nan],
#Spalte D.:nur int
"D": [1, 2, 3, 4]
}
)
Keiner scheint in np.nan konvertiert zu sein ... Außerdem wird die Spalte mit np.nan zu 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)
Alle Werte haben sich nicht geändert. Keiner bleibt unverändert
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)
Leere Zeichen können nicht in Float geändert werden. Nur Spalten mit leeren Zeichen werden zum Objekttyp
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)
Spalten, die nicht in int64 konvertiert werden können (Spalten, die np.nan oder None enthalten), sind vom Typ Objekt
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)
Überprüfen Sie, was mit dem Spaltentyp passiert, wenn die folgende CSV mit unterschiedlichen dtypes angegeben wird
sample.csv
#Zeile A.: int+Himmel
#Spalte B.:String+Leerer Charakter
#Spalte C.: float+Himmel
#Spalte D.:nur int
A,B,C,D
1,"1",1.0,1
2,"2",2.0,2
3,"3",3.0,3
,"",,4
Sowohl leere als auch leere Zeichen werden als np.nan gelesen und int wird entsprechend in float konvertiert.
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.]])
Leere und leere Zeichen werden in np.nan konvertiert, andere Werte werden jedoch in den Typ str konvertiert
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)
Alle Spalten werden in den Typ float64 konvertiert
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.]])
Da leere und leere Zeichen in np.nan konvertiert werden, können sie nicht als int gelesen werden und es tritt ein Fehler auf.
df = pd.read_csv("sample.csv", dtype=int)
ValueError: Integer column has NA values in column 0
Verhalten beim Ausfüllen der folgenden Daten
df = pd.DataFrame(
{
#Zeile A.: int+None
"A": [1, 2, 3, None],
#Spalte B.: str+Leerer Charakter
"B": ["1", "2", "3", ""],
#Spalte C.: int+np.nan
"C": [1, 2, 3, np.nan],
#Spalte D.:nur int
"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)
Wenn Sie "df.fillna (" FILL ")" ausführen, werden die Werte "None" und "np.nan" konvertiert, die leeren Zeichen bleiben jedoch erhalten.
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)
In ähnlicher Weise besteht das Verhalten zum Zeitpunkt von dropna darin, dass die Zeilen und Spalten, die np.nan und None enthalten, gelöscht werden, leere Zeichen jedoch nicht als fehlende Werte behandelt werden.
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)
Führen Sie die Überprüfung mit dem folgenden Datenrahmen durch
df = pd.DataFrame(
{
#Zeile A.: int+None
"A": [1, 2, 3, None],
#Spalte B.: str+Leerer Charakter
"B": ["1", "2", "3", ""],
#Spalte C.: int+np.nan
"C": [1, 2, 3, np.nan],
#Spalte D.:nur int
"D": [1, 2, 3, 4]
},
dtype="object"
)
Bei der Gruppierung in einer Spalte mit None, np.nan werden die Zeilen None, np.nan ignoriert (fehlen).
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)
Wenn die Spalte leere Zeichen enthält, wird sie nicht ignoriert
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)