2016-09-11 3 views
1

Ich bin nicht sicher, warum dies geschiehtEinstellelemente auf Keinem in Pandas Datenrahmen

>>> df = pd.DataFrame(np.arange(15).reshape(5,3),columns=list('ABC')) 
>>> df 
    A B C 
0 0 1 2 
1 3 4 5 
2 6 7 8 
3 9 10 11 
4 12 13 14 

zuordnen None auf Elemente in letzten Zeile verwandelt es in NaN NaN NaN:

>>> df.ix[5,:] = None 
>>> df 
    A B C 
0 0 1 2 
1 3 4 5 
2 6 7 8 
3 9 10 11 
4 12 13 14 
5 NaN NaN NaN 

ändern zwei Element in letzten Spalte zu

>>> df.ix[:1,2] = 'nan' 
>>> df 
    A B C 
0 0 1 nan 
1 3 4 nan 
2 6 7 8 
3 9 10 11 
4 12 13 14 
5 NaN NaN NaN 

Jetzt letzte Zeile 'nan' wird NaN NaN None

>>> df.ix[5,:] = None 
>>> df 
    A B  C 
0 0 1 nan 
1 3 4 nan 
2 6 7  8 
3 9 10 11 
4 12 13 14 
5 NaN NaN None 
+0

Wahrscheinlich möchten Sie 'np.nan' –

+0

@DavidArenburg Ich könnte eine andere Zeichenfolge anstelle von 'Nan' verwendet haben, der Effekt ist der gleiche – user2314737

+0

Wenn Sie' df.ix [: 1,2] = np verwenden. nan' then, 'df.ix [5 ,:] = None' funktioniert wie erwartet, weil' C' eine Spalte ist, also nicht sicher ist, was du meinst. MaxU scheint es auch in seiner Antwort bearbeitet zu haben ... –

Antwort

2

Es ist, weil Ihre dtypes nach jeder Zuordnung geändert werden:

In [7]: df = pd.DataFrame(np.arange(15).reshape(5,3),columns=list('ABC')) 

In [8]: df.dtypes 
Out[8]: 
A int32 
B int32 
C int32 
dtype: object 

In [9]: df.loc[5,:] = None 

In [10]: df.dtypes 
Out[10]: 
A float64 
B float64 
C float64 
dtype: object 

In [11]: df.loc[:1,2] = 'nan' 

nach der letzten Zuordnung der C Spalte object implizit umgewandelt wurde (string) dtype:

In [12]: df.dtypes 
Out[12]: 
A float64 
B float64 
C  object 
dtype: object 

@ayhan has written very neat answer as a comment:

Ich denke, der Hauptgrund ist für numerische Spalten, wenn Sie keine oder np.nan einfügen, wird es in np.nan konvertiert, um eine Serie vom Typ float zu haben. Für Objekte, dauert es, was auch immer passiert ist (falls keine, es keine verwendet, wenn np.nan, es np.nan verwendet - docs)

(c) ayhan

Hier ist eine entsprechende Demo:

In [39]: df = pd.DataFrame(np.arange(15).reshape(5,3),columns=list('ABC')) 

In [40]: df.loc[4, 'A'] = None 

In [41]: df.loc[4, 'C'] = np.nan 

In [42]: df 
Out[42]: 
    A B  C 
0 0.0 1 2.0 
1 3.0 4 5.0 
2 6.0 7 8.0 
3 9.0 10 11.0 
4 NaN 13 NaN 

In [43]: df.dtypes 
Out[43]: 
A float64 
B  int32 
C float64 
dtype: object 

In [44]: df.loc[0, 'C'] = 'a string' 

In [45]: df 
Out[45]: 
    A B   C 
0 0.0 1 a string 
1 3.0 4   5 
2 6.0 7   8 
3 9.0 10  11 
4 NaN 13  NaN 

In [46]: df.dtypes 
Out[46]: 
A float64 
B  int32 
C  object 
dtype: object 

jetzt können wir beide None und np.nan für die object dtype verwenden:


UPDATE: von Pandas beginnend 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers.

+1

Ich denke, der Hauptgrund ist für numerische Spalten, wenn Sie None oder np.nan einfügen, wird es in np.nan konvertiert, um eine Reihe vom Typ float zu haben. Für Objekte wird alles übernommen, was übergeben wird (wenn None, wird None verwendet; wenn np.nan, wird np.nan - [docs] verwendet (http://pandas.pydata.org/pandas-docs/stable/missing_data.html) # Einfügen-Fehlende-Daten)) – ayhan

+1

@ayhan, es ist eine sehr saubere Antwort, danke! Ich habe es der Antwort hinzugefügt – MaxU

Verwandte Themen