当我使用petl处理我的数据,然后将其写入pandas DataFrame时,我注意到pandas自动识别类型的奇妙能力消失了。有没有办法在保留pandas自动识别数据类型的能力的同时,使用petl的特性呢?
df = pd.read_csv(csvpath)
df
Out[17]:
cis boom bah bish
0 A 1 NaN True
1 B 4 1.0 False
2 C 11 NaN False
df.dtypes
Out[18]:
cis object
boom int64
bah float64
bish bool
dtype: object
tbl = etl.fromcsv(csvpath)
df2 = etl.todataframe(tbl)
df2
Out[20]:
cis boom bah bish
0 A 1 TRUE
1 B 4 1 FALSE
2 C 11 FALSE
df2.dtypes
Out[21]:
cis object
boom object
bah object
bish object
dtype: object发布于 2017-05-04 23:48:25
我没有使用petl,所以我只是在这里猜测。我怀疑petl正在猜测数据类型,并将这些猜测传递给Pandas……我打赌它不像Pandas那样擅长猜测。您可以编写一个小的包装器函数,将petl数据转储到csv中,然后使用pd.read_csv()将其吸回,从而强制Pandas进行类型推断。您还可以检查csv并确保petl没有以某种奇怪的方式干扰日期格式。
更复杂的是,您可以只写出几百行,使用pandas读回这些行,然后迭代pandas数据帧并确定行类型。然后,您可以将它们分配给petl容器。
convert(tbl, 'bar', int)发布于 2017-05-06 01:40:49
这可能是你所需要的一种基本方法,尽管我不知道它可能会有多耗费资源。
import petl as etl
import pandas as pd
table = etl.frompickle('temp.pickle')
print (table)
dtypes = {}
for fieldName in table.fieldnames():
typeset = [_ for _ in list(etl.typeset(table, fieldName)) if _ != 'NoneType']
if len(typeset) > 1:
print ('Warning: more than one type found, using convenient value found')
dtypes[fieldName]=typeset[0]
cols = etl.columns(table)
first = True
for fieldname in table.fieldnames():
if first:
df = pd.DataFrame.from_dict({fieldname: cols[fieldname]}, dtype=dtypes[fieldname])
first = False
else:
column = pd.DataFrame.from_dict({fieldname: cols[fieldname]}, dtype=dtypes[fieldname])
df = df.join(column)
print (df)下面是您的示例的输出,稍作修改。
+-----+------+------+-------+
| cis | boom | bah | bish |
+=====+======+======+=======+
| A | 1 | None | True |
+-----+------+------+-------+
| B | None | 1.0 | False |
+-----+------+------+-------+
| C | 11 | None | False |
+-----+------+------+-------+
cis boom bah bish
0 A 1 NaN True
1 B None 1.0 False
2 C 11 NaN False我省略了一个整数值(代表'boom'),因为整数没有NaN,我想学习如何处理这个问题。我不清楚numpy的答案可能是什么--有些答案看起来很难看--所以我避开了它。在没有声明dtype的情况下,pandas会将boom转换为float。这就是为什么我包含了练习petl的排版内容的代码。这是一种非常基本的方法。如果您有同时包含整型和浮点值的列,那么您可能希望对其进行扩展,以便选择浮点型而不是整型,并将其传递给pandas。
https://stackoverflow.com/questions/43786873
复制相似问题