2017-10-21 102 views
1

創建與熊貓pivot_table一個新數據幀之後,從INT32的D型細胞改變爲浮動大熊貓樞軸變化DTYPE

原始數據幀

df = pd.DataFrame.from_dict(my_dict, orient='columns', dtype='i4') 
print(df.head(11)) 

輸出:

  clock eventid   ns objectid value 
0 1505960158 62704261 327504323  32219  1 
1 1505962773 62711138 22192905  32219  0 
2 1505400465 61216428 123915259  32233  1 
3 1504642494 59208977 369082011  32254  1 
4 1504643325 59210478 576875730  32254  0 
5 1504642494 59208978 369082011  32260  1 
6 1504643325 59210479 576875730  32260  0 
7 1504224224 58101461 445846619  13479  0 
8 1504258784 58187457 204908064  13479  1 
9 1504310624 58318750 443786274  13479  0 
10 1504517992 58886060 746243067  13479  1 

print(df.dtypes) 

輸出:

clock  int32 
eventid  int32 
ns   int32 
objectid int32 
value  int32 
dtype: object 

WHE我用pivot_table

p = df.reset_index().pivot_table(index="objectid", columns="value", values="clock", fill_value=0).iloc[:, ::-1] 
print(p) 

輸出:

value    1    0 
objectid       
13479  1505534184 1.505467e+09 
13485  1505676014 1.505677e+09 
32219  1505960158 1.505963e+09 
32233  1505400465 0.000000e+00 
32254  1504642494 1.504643e+09 
32260  1504642494 1.504643e+09 
print(p.dtypes) 

輸出:

value 
1  int64 
0 float64 
dtype: object 

爲什麼列成爲浮動?如何避免這種情況?

回答

1

你的樣本數據可能不會表現出來,但你轉動操作的結果可能包含NaN s,這是float型的,所以列的其餘部分也自動熊貓高效計算upcasted到float。請注意,NaN由零填充(fill_value=0),所以您不會看到它們。

例如,有一個與objectid = 32233value = 0沒有行,使相應的在數據透視結果條目NaN,然後把它裝滿0顯示出來。現在

,它的清楚爲什麼列upcasted,您可以重新使用astype數據類型:

p = p.astype(int) 
+0

沒有「男」。 DF數據幀有133行,但P數據幀只有6.我將編輯我的問題。 –

+0

@JoaoVitorino做'df.isnull()。any()',看看輸出結果如何。你的一個結果有一個「0.0000000e + 00」,所以這只是一個指示。 –

+0

df.isnull()。any()對所有列返回false –