将 pint-panda 数据帧转换为 numpy

问题描述 投票:0回答:1

我有一个大型数据帧(> 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
中的浮点格式不兼容。

如何将我的数据框转换为浮动而不生成所有这些警告消息?或者删除我数据上的品脱效应?

pandas numpy pint
1个回答
0
投票

要从数据框中删除品脱层并将其转换为浮点数而不生成警告,您可以迭代数据框的列并提取每个品脱数量的大小:

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="")
© www.soinside.com 2019 - 2024. All rights reserved.