我想在pd.Dataframe
中设置多个列的dtype
(我有一个文件,我不得不手动解析成一个列表列表,因为该文件不适合pd.read_csv
)
import pandas as pd
print pd.DataFrame([['a','1'],['b','2']],
dtype={'x':'object','y':'int'},
columns=['x','y'])
我明白
ValueError: entry not a 2- or 3- tuple
我设置它们的唯一方法是循环遍历每个列变量,然后用astype
重新转换。
dtypes = {'x':'object','y':'int'}
mydata = pd.DataFrame([['a','1'],['b','2']],
columns=['x','y'])
for c in mydata.columns:
mydata[c] = mydata[c].astype(dtypes[c])
print mydata['y'].dtype #=> int64
有更好的办法吗?
7条答案
按热度按时间p5cysglq1#
从0.17开始,你必须使用显式转换:
(As下面提到的,没有更多的“魔术”,
convert_objects
已在0.17中被弃用)您可以将这些应用于要转换的每个列:
并确认更新了dtype。
pandas 0.12 - 0.16的旧/弃用答案:你可以使用
convert_objects
来推断更好的dtypes:“魔术!”(看到它被弃用很难过。)
kmynzznz2#
你可以用pandas
DataFrame.astype(dtype, copy=True, raise_on_error=True, **kwargs)
显式地设置类型,并传入一个字典,里面有你想要的dtypesdtype
下面是一个示例:
你得到
与
现在你可以看到它已经改变了
iq0todco3#
对于那些来自谷歌(等)的人,比如我自己:
convert_objects
从0.17开始就被弃用了--如果你使用它,你会得到一个像这样的警告:您应该执行以下操作:
df =
df.astype(np.float)
df["A"] =
pd.to_numeric(df["A"])
oyjwcjzk4#
设置列类型的另一种方法是首先用所需的类型构造一个numpy记录数组,填充它,然后将其传递给DataFrame构造函数。
fae0ux8s5#
最好使用类型化的np.arrays,然后将数据和列名作为字典传递。
bf1o4zei6#
mzmfm0qo7#
面对类似的问题,你。在我的情况下,我有1000的文件,从思科日志,我需要手动解析。
为了灵活地处理字段和类型,我已经成功地使用StringIO + read_cvs进行了测试,它确实接受了dtype规范的dict。
我通常将每个文件(5 k-20 k行)放入一个缓冲区,并动态创建dtype字典。
最后,我将这些 Dataframe 连接(使用分类...感谢0.19)成一个大 Dataframe ,然后转储到hdf 5中。
沿着这样的东西
不是很pythonic....但做的工作
希望能帮上忙。
JC