2016-02-09 55 views
3

我有一個我認爲會很常見的用例,所以我認爲我的這個問題應該很容易回答自己,但我無法在任何地方找到答案。考慮以下。Python熊貓。使用Series創建DataFrame不會保留dtype

df = pandas.DataFrame({"id": numpy.random.choice(range(100), 5, replace=False), 
         "value": numpy.random.rand(5)}) 
df2 = pandas.DataFrame([df["id"], df["value"]*2]).T 

基本上我創建一個DataFramedf2的基礎上,一箇舊DataFramedf值。現在,如果我們運行

print(df.dtypes, end="\n------\n") 
print(df2.dtypes) 

我們得到

id   int64 
value float64 
dtype: object 
------ 
id  float64 
value float64 
dtype: object 

你可以看到,df2第一列的dtypefloat64,而不是int64理所應當的,即使Seriesdtype本身是int64。這種行爲對我來說非常困難,我不能相信這是故意的。如何從Series s創建DataFrame並保留Series s的dtype s?在我看來,它應該像pandas.DataFrame([s1, s2], dtypes=[int, float])一樣簡單,但由於某種原因,您不能在pandas中那樣做。

回答

4

DataFrame的列始終只有一個dtype。 (這是因爲, 引擎蓋下,熊貓存儲列中的數據的具有在塊中相同的D型。)

pd.DataFrame傳遞系列的清單,它 解包每個系列到一個單獨的行。由於系列具有不同的dtype,因此列最終會以混合dtype的值結束。熊貓通過將每列中的所有值升級到單個dtype來嘗試解決此問題。


您可以用定義df2

df2 = pd.DataFrame({'id': df["id"], 'value': df["value"]*2}) 

df2 = df.copy() 
df2['value'] *= 2 

df2 = pd.concat([df["id"], df["value"]*2], axis=1)