Chr*_*ris 34 python types pandas
我想将一些数据带入pandas DataFrame,我想在导入时为每列分配dtypes.我希望能够为具有许多不同列的较大数据集执行此操作,但是,作为示例:
myarray = np.random.randint(0,5,size=(2,2))
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype=[float,int])
mydf.dtypes
Run Code Online (Sandbox Code Playgroud)
结果是:
TypeError:数据类型未被理解
我尝试了一些其他方法,例如:
mydf = pd.DataFrame(myarray,columns=['a','b'], dtype={'a': int})
Run Code Online (Sandbox Code Playgroud)
TypeError:类型为'type'的对象没有len()
如果我把dtype=(float,int)
它应用浮动格式到两列.
最后,我想能够传递一个数据类型列表,就像我可以传递一个列名列表一样.
mat*_*exx 16
我刚刚碰到这个,大熊猫的问题仍然存在,所以我发布了我的解决方法.假设df
是我的DataFrame并且dtype
是将列名称映射到类型的dict:
for k, v in dtype.items():
df[k] = df[k].astype(v)
Run Code Online (Sandbox Code Playgroud)
(注意:dtype.iteritems()
在python 2中使用)
供参考:
dtypes
):https://docs.scipy.org/doc/numpy-1.12.0/reference/arrays.dtypes.htmlcategory
:http://pandas.pydata.org/pandas-docs/stable/categorical.html您可能想尝试将Series
对象字典传递给DataFrame
构造函数 - 它会让您对创建进行更具体的控制,并且希望应该更清楚发生了什么。模板版本(data1
可以是数组等):
df = pd.DataFrame({'column1':pd.Series(data1, dtype='type1'),
'column2':pd.Series(data2, dtype='type2')})
Run Code Online (Sandbox Code Playgroud)
和数据示例:
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
Run Code Online (Sandbox Code Playgroud)
从 pandas 0.24.2 版(当前稳定版本)开始,无法将显式数据类型列表传递给 DataFrame 构造函数,如文档所述:
dtype : dtype, default None
Data type to force. Only a single dtype is allowed. If None, infer
Run Code Online (Sandbox Code Playgroud)
但是,数据帧类确实有一个静态方法,允许您将 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
Run Code Online (Sandbox Code Playgroud)