python中dtypes_关于python:如何通过pandas DataFrame中的列设置dtypes
我想將一些數據帶入pandas DataFrame,并為導入時的每一列分配dtypes。 我希望能夠對具有許多不同列的較大數據集執行此操作,但是,例如:
myarray = np.random.randint(0,5,size=(2,2))
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int])
mydf.dtypes
結果是:
TypeError: data type not understood
我嘗試了其他一些方法,例如:
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})
TypeError: object of type 'type' has no len()
如果我放dtype=(float,int),它將浮點格式應用于兩列。
最后,我希望能夠將其傳遞給數據類型列表,就像我將其傳遞給列名稱列表一樣。
dtype的參數應該是有效的numpy dtype(并且不支持結構化dtype),因此列表或字典將不起作用。 一種可能的方法是分別為每個列進行分類。 或者首先創建一個結構化的numpy數組,并將其提供給DataFrame。
我知道我可以在循環中分別分配每個對象,但令我驚訝的是dtype =不夠靈活,無法容納列表。 不過感謝您的回答,很高興得到確認:)
github.com/pydata/pandas/issues/4464目前是一個未解決的問題(如果您想執行拉取請求,那就太好了)
只是為了好玩:有人使用read_csv解決了這個問題:stackoverflow.com/a/38524255/6646912:D
我剛遇到這個問題,而熊貓問題仍未解決,所以我發布了解決方法。假設df是我的DataFrame,而dtype是將列名稱映射到類型的字典:
for k, v in dtype.items():
df[k] = df[k].astype(v)
(注意:在python 2中使用dtype.iteritems())
供參考:
允許的數據類型列表(NumPy dtypes):https://docs.scipy.org/doc/numpy-1.12.0/reference/arrays.dtypes.html
熊貓還支持其他一些類型。例如category:http://pandas.pydata.org/pandas-docs/stable/categorical.html
相關的GitHub問題:https://github.com/pandas-dev/pandas/issues/9287
我需要使用for k, v in dtype.iteritems():才能正常工作。
可以將其更改為df.astype(dtype)
對于某些類型轉換,此方法嚴重失敗:stackoverflow.com/questions/54393266/
您可能希望嘗試將Series對象的字典傳遞給DataFrame構造函數-它會為您提供對創建的更多具體控制,并且希望可以更清楚地了解發生了什么。模板版本(data1可以是數組等):
df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'),
'column2':pd.Series(data2, dtype='type2')})
并舉例說明數據:
df = pd.DataFrame({'A':pd.Series([1,2,3], dtype='int'),
'B':pd.Series([7,8,9], dtype='float')})
print (df)
A ?B
0 ?1 ?7.0
1 ?2 ?8.0
2 ?3 ?9.0
print (df.dtypes)
A ? ? int32
B ? ?float64
dtype: object
從pandas 0.24.2版本(當前的穩定版本)開始,無法將docs類型的數據類型的顯式列表傳遞給DataFrame構造函數:
dtype : dtype, default None
Data type to force. Only a single dtype is allowed. If None, infer
但是,dataframe類確實具有靜態方法,允許您將numpy結構化數組轉換為數據框,因此您可以執行以下操作:
>>> myarray = np.random.randint(0,5,size=(2,2))
>>> record = np.array(map(tuple,myarray),dtype=[('a',np.float),('b',np.int)])
>>> mydf = pd.DataFrame.from_records(record)
>>> mydf.dtypes
a ? ?float64
b ? ? ?int64
dtype: object
在處理數據類型時,應將它們作為字符串傳遞。
例如,您遵循的后一種方法應修改為
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **'int'**})
代替
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **int**})。
dtype (int, float etc.)應該以字符串形式給出。
或者作為替代方法(如果您不想作為字符串傳遞)
將numpy導入為np并使用
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': **np.int**})
我不明白為什么**在那里。 那是不正確的語法。 將它們取出,放在mydf = pd.DataFrame(myarray,columns=[a,b], dtype={a: **np.int**})的最后一行,它仍然不起作用:它給出了TypeError: data type not understood。
總結
以上是生活随笔為你收集整理的python中dtypes_关于python:如何通过pandas DataFrame中的列设置dtypes的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 什么是过桥贷 是一种短期贷款
- 下一篇: 乡下开服装店赚钱吗 算是比较好的项目了