2017-12-27 4 views
1

Ich habe einen Datenrahmen erstellt und apply (type)/applymap (type) auf verschiedene Arten aufrufen. Das Problem ist, dass ich unterschiedliche Ergebnisse bekommen habe. Ich bin verwirrt über die int und int64 Arten.Warum werden in Pandas falsche Ergebnisse angezeigt?

In [116]: df_term[0:5] 
Out[116]: 
        term tag count weight   pt 
0     -03 OTHER 380 3085.0 2017-12-06 
1     -300 NUM 1224 6120.0 2017-12-06 
2     -805 OTHER  30 258.0 2017-12-06 
3 0-150mm0-200mm0-300mm  XH  27 1650.0 2017-12-06 
4     040639 OTHER  52 464.0 2017-12-06 

In [106]: df_term.dtypes 
Out[106]: 
term  object 
tag  object 
count  int64 
weight float64 
pt   object 
dtype: object 

In [109]: type(df_term.iloc[0]['count']) 
Out[109]: numpy.int64 

In [111]: df_term.iloc[0].apply(type)['count'] 
Out[111]: numpy.int64 

In [113]: type(df_term['count'].iloc[0]) 
Out[113]: numpy.int64 

In [114]: df_term['count'].apply(type)[0] 
Out[114]: int 

In [115]: df_term[0:1].applymap(type)['count'] 
Out[115]: 
0 <type 'int'> 
Name: count, dtype: object 

Ich habe auch versucht, ihre Typen zu vergleichen:

In [156]: df_term.iloc[0].apply(type)['count'] 
Out[156]: numpy.int64 

In [157]: df_term.applymap(type).iloc[0]['count'] 
Out[157]: int 

In [158]: df_term.iloc[0].apply(type)['count'] == df_term.applymap(type).iloc[0]['count'] 
Out[158]: False 
+0

Können Sie fügen die ersten 5 Zeilen von 'df_term'? –

+0

@ cᴏʟᴅsᴘᴇᴇᴅ, ich habe seinen Inhalt eingefügt – moshangcheng

+0

Ah, die Dinge sind jetzt ziemlich klar Es gibt einen Unterschied zwischen dem, was' Pandas' anzeigt und was IPython dir zeigt, aber sie sind beide gleich –

Antwort

1

ein einfaches Beispiel -

In [13]: x = 5 

In [14]: type(x) 
Out[14]: int 

In [15]: repr(type(x)) 
Out[15]: "<class 'int'>" 

Diese erste Ausgabe ist prettification der IPython was type zurückkehrt. Die zweite Ausgabe ist die __repr__ des gleichen Ausgangs, und was Pandas Ihnen zeigt.

Im Wesentlichen sind sie beide die gleiche Sache. Sie können explizit IPython ‚s pretty-Drucker in Aktion sehen, indem es von IPython.lib Import -

s = pd.Series([1, 2, 3, 4]) 
s.apply(type) 

0 <class 'int'> 
1 <class 'int'> 
2 <class 'int'> 
3 <class 'int'> 
dtype: object 
from IPython.lib.pretty import pretty 

for r in s.apply(type): 
    print(pretty(r)) 

int 
int 
int 
int 

In Bezug auf die Differenz zwischen int und np.int64 wird angezeigt, betrachten -

In [16]: df.loc[0, 'count'] 
Out[16]: 380 

In [17]: type(df.loc[0, 'count']) 
Out[17]: numpy.int64 

In [18]: type(df.loc[0, 'count'].item()) 
Out[18]: int 

Die Daten werden standardmäßig in Datenrahmenspalten als 0 geladenObjekte. Beim Zugriff auf ein bestimmtes Element nach Index wird immer das Objekt numpy zurückgegeben, das Sie dann durch Aufruf von .item() für das Objekt numpy an ein Python-Objekt übergeben können. Meine Überzeugung ist, apply implizit tut so etwas wie dies innerhalb Series.apply, um den Wert in jeder Zeile zu übergeben die Funktion, die apply (type in diesem Fall erhält, weshalb Sie <class 'int'> sehen und nicht <class 'np.int64'>.

+0

Ich habe versucht, diese Typen zu vergleichen, und sie sind nicht gleich. – moshangcheng

+0

@moshangcheng Richtig, so meine Vermutung in Bezug auf den Unterschied ist, dass Daten in Pandas Spalten als numpy Objekte standardmäßig geladen werden (für performanc Wenn Sie 'df.loc [0, 'count']' gemacht haben, sehen Sie, dass ein 'int64' Objekt zurückgegeben wird. Rufen Sie nun 'df.loc [0, 'count']. Item()' auf, und ein _int_ Objekt wird zurückgegeben. Meine Annahme ist, dass implizit so etwas wie folgt angewendet wird, indem ein Element innerhalb des Anwendungskörpers an "type" übergeben wird. –

Verwandte Themen