似乎没有办法将输入表(从 html/xls/etc 文件)获取到 DataFrame 对象,因为它是一对一的,没有 Pandas 内部应用的任何字段转换。
假设以下 html 表以 .xls 文件的扩展名保存,我们如何在 Python 内存中使用 DataFrame 对象获得该表的相同表示?
“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。我认为这个逻辑包括语言环境设置,可能是 Pandas 内部的一些规则等。直接指定字符串转换器不允许获取初始值。
(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
可能有 的情况。一个 文件包含在 中键入的数字不同格式(美国/欧洲/等)。这个数字与小数点、千位标记等不同。因此,处理此类文件的逻辑方法是在字符串中“按原样”提取数据,并使用正则表达式/其他模块分别为每一行执行解析。有没有办法在 Pandas 中做到这一点?还有其他方法可以处理此类文件的处理吗?多谢你们!
备注:
pandas.read_* 的“十进制”和“千”参数的规范看起来不是一个可靠的解决方案,因为它适用于所有字段。快速示例:它可以处理 中的日期字段"02.2017"格式为数字并将其转换为 "022017" .
最佳答案
您必须指定千位和小数分隔符。这对我有用:
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)
关于python - Pandas 将数字转换为字符串 - 意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47327966/