Pandas将数字转换为字符串 - 意外结果

时间:2017-11-16 11:01:50

标签: python pandas dataframe file-conversion

似乎无法获取输入表(从html / xls / etc文件)到DataFrame对象,因为它是1对1而没有在pandas内部应用任何字段转换。

假设下面的html表保存了扩展名为.xls的文件,我们如何使用DataFrame对象在Python内存中获得该表的相同表示?

" test_file.xls"的内容:

<body>
    <table>
        <thead>
            <tr>
                <th class="tabHead" x:autofilter="all">Number</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td class="tDetail">1.320,00</td>
            </tr>
            <tr>
                <td class="tDetail">600,00</td>
            </tr>
        </tbody>
    </table>
</body>

(1)直接阅读文件

处理代码:

import pandas

df = pandas.read_html('test_file.xls')
print(df[0])
print(df[0].dtypes)

输出:

     Number
0      1.32
1  60000.00

Number    float64
dtype: object

正如我们所看到的那样,数字是转换为float64的一些预定义逻辑。我认为这个逻辑包括语言环境设置,也许是熊猫中的一些规则等。直接指定字符串转换器并不能获得初始值。

(2)将str函数用作每个维度的转换器

处理代码:

converters = {column_name: str for column_name in df[0].dtypes.index}
df = pandas.read_html(f, converters = converters)
print(df[0])
print(df[0].dtypes)

输出:

    Number
0  1.32000
1    60000

Number    object
dtype: obje

显然,此问题的预期输出是:

     Number
0  1.320,00
1    600,00

可能存在一个文件包含以不同格式(美国/欧洲/等)格式输入的数字的情况。这个数字与十进制标记,千位标记等不同。因此处理这些文件的逻辑方法是提取数据&#34;因为它是&#34;在字符串中,并为每一行分别使用regexps /其他模块进行解析。有没有办法在熊猫中怎么做?有没有其他方法来处理这种文件的处理?谢谢你们!

说明: 规范&#34;十进制&#34;和#&#34;数千&#34; pandas.read_ *的参数看起来不是一个可靠的解决方案,因为它适用于所有字段。简单示例:它可以将&#34; 02.2017&#34; 格式的日期字段视为数字,并将其转换为&#34; 022017&#34;

2 个答案:

答案 0 :(得分:1)

您必须指定千位和小数分隔符。这对我有用:

import pandas as pd

html = """
<body>
    <table>
        <thead>
            <tr>
                <th class="tabHead" x:autofilter="all">Number</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td class="tDetail">1.320,00</td>
            </tr>
            <tr>
                <td class="tDetail">600,00</td>
            </tr>
        </tbody>
    </table>
</body>
"""

df = pd.read_html(html, decimal=",", thousands=".")
print(df)

答案 1 :(得分:0)

这行吗?

import pandas as pd


with open('test_file.xls') as f:
    raw_html = f.read()


raw_html = raw_html.replace('"tDetail">', """tDetail">'""").replace('</td>', "'</td>")


df = pd.read_html(raw_html)

返回

       Number
0  '1.320,00'
1    '600,00'