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"。
这有效吗?
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)