0

当我使用 petl 整理我的数据,然后将其写入 pandas DataFrame 时,我注意到 pandas 自动识别类型的奇妙能力消失了。有什么方法可以使用 petl 的功能,同时保留 pandas 自动识别数据类型的能力?

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
4

2 回答 2

0

我没有用过petl,所以我只是在这里猜测。我怀疑 petl 是在猜测数据类型并将这些猜测传递给 Pandas……我敢打赌它不像 Pandas 那样擅长猜测。您可以编写一个小包装函数,将 petl 数据转储到 csv,然后使用pd.read_csv()这种方式将 Pandas 强制执行类型推断。您还可以检查 csv 并确保 petl 没有以某种奇怪的方式干扰日期格式。

更复杂的是,您可以只写出几百行,使用 pandas 将它们读回,然后遍历 pandas 数据帧并确定行类型。然后你可以将它们分配给 petl 容器。

convert(tbl, 'bar', int)
于 2017-05-04T15:48:25.157 回答
0

这可能是您需要的基本方法,尽管我不知道它可能证明是多么的资源匮乏。

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 会将繁荣转换为浮动。这就是为什么我包含了练习 petl 排版内容的代码。这是一个非常基本的方法。如果您有包含整数和浮点值的列,那么您可能希望扩展它,以便选择浮点而不是整数类型并传递给熊猫。

于 2017-05-05T17:40:48.767 回答