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

Ple*_*eea 7 python file-conversion dataframe pandas

似乎没有办法将输入表(从 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>
Run Code Online (Sandbox Code Playgroud)

(1)直接读取文件

处理代码:

import pandas

df = pandas.read_html('test_file.xls')
print(df[0])
print(df[0].dtypes)
Run Code Online (Sandbox Code Playgroud)

输出:

     Number
0      1.32
1  60000.00

Number    float64
dtype: object
Run Code Online (Sandbox Code Playgroud)

正如我们所看到的,这些数字是通过一些预定义的逻辑转换为 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)
Run Code Online (Sandbox Code Playgroud)

输出:

    Number
0  1.32000
1    60000

Number    object
dtype: obje
Run Code Online (Sandbox Code Playgroud)

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

     Number
0  1.320,00
1    600,00
Run Code Online (Sandbox Code Playgroud)

可能存在一个文件包含以不同格式(美国/欧洲/等)键入的数字的情况。该数字因小数点、千位点等而异。因此,处理此类文件的逻辑方法是“按原样”提取字符串中的数据,并为每一行分别使用正则表达式/其他模块进行解析。有没有办法在熊猫中做到这一点?还有其他方法如何处理此类文件的处理?谢谢你们!

备注: pandas.read_* 的“decimal”和“thousands”参数规范看起来不像是一个可靠的解决方案,因为它适用于所有领域。快速示例:它可以将"02.2017"格式的日期字段视为数字并将其转换为"022017"

kai*_*ait 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)
Run Code Online (Sandbox Code Playgroud)

退货

       Number
0  '1.320,00'
1    '600,00'
Run Code Online (Sandbox Code Playgroud)