我有一个大型数据帧(> 30 000 行和> 500 列),我使用 pint 使用 pint-panda 选项从一个单位转换为另一个单位,然后我希望将数据帧写入文本文件。我有多达 20 000 个文本文件要写入。
但是,我在 pint 文档中找不到如何在转换完成后“删除”pint 层。 出于速度原因,我使用
np.savetxt()
而不是 panda 解决方案。为此,我首先将数据帧转换为浮点 df.astype(float)
,然后在文本文件中应用所需的浮点格式。
np.savetxt( 文件,output_data.astype(float), header=header_out, 分隔符=“”,fmt=“%-15.5e”,注释=“”,)
但是这样做会生成与列一样多的警告消息:
UnitStrippedWarning: The unit of the quantity is stripped when downcasting to ndarray
我正在使用一个丑陋的解决方法
warnings.filterwarnings("ignore")
来避免收到垃圾邮件,但这不是最好的解决方案。
使用
df.to_numpy()
会生成 pint
Quantity 对象,该对象与 np.savetxt
中的浮点格式不兼容。
如何将我的数据框转换为浮动而不生成所有这些警告消息?或者删除我数据上的品脱效应?
要从数据框中删除品脱层并将其转换为浮点数而不生成警告,您可以迭代数据框的列并提取每个品脱数量的大小:
import pandas as pd
import numpy as np
import pint ##pip install pint
import warnings
# Create a UnitRegistry
ureg = pint.UnitRegistry()
Q_ = ureg.Quantity
# Sample dataframe with pint quantities
data = {'length': [Q_(1.5, 'meter'), Q_(2.0, 'meter')], 'weight': [Q_(3.0, 'kilogram'), Q_(4.0, 'kilogram')]}
df = pd.DataFrame(data)
# Function to remove pint quantities and get magnitudes
def remove_pint_quantities(df):
new_df = pd.DataFrame()
for col in df.columns:
new_df[col] = df[col].apply(lambda x: x.magnitude if isinstance(x, Q_) else x)
return new_df
# Remove pint quantities
df_magnitude = remove_pint_quantities(df)
# Convert to numpy array
output_data = df_magnitude.to_numpy()
# Define header
header_out = "length weight"
# Save to text file without warnings
np.savetxt('output.txt', output_data.astype(float), header=header_out, delimiter=" ", fmt="%-15.5e", comments="")