python - 正确处理缺失值和格式化 pandas 数据框打印以制表

标签 python pandas formatting missing-data tabulate

在以下场景中,我想:

  • 使用自定义字符替换缺失值,例如 -
  • 应用数字的自定义格式

问题

我似乎只能实现其中一个目标。如果我使用下面的代码,我可以在格式化方面达到预期的结果;但是缺失值被打印为 nan

"""Handling Missing Data in Pandas / Tabulate
"""

import pandas as pd
from tabulate import tabulate
import seaborn as sns
import numpy as np

# Create sample data
iris_data = sns.load_dataset('iris')
# Derive summary table
iris_summary = pd.DataFrame.describe(iris_data, percentiles=[]).transpose()
# Add missing values
iris_summary.iloc[0, 1:6] = None


# Show missing data
print(tabulate(iris_summary, missingval="-",
               floatfmt=(".0f", ".0f", ".3f", ".1f", ".4f", ".1f", ".0f")))

结果

------------  ---  -------  -----  --------  -----  ---
sepal_length  150  nan      nan    nan       nan    nan
sepal_width   150    3.057    0.4    2.0000    3.0    4
petal_length  150    3.758    1.8    1.0000    4.3    7
petal_width   150    1.199    0.8    0.1000    1.3    2
------------  ---  -------  -----  --------  -----  ---

尝试 1

我尝试替换缺失的值

iris_summary.replace(np.nan, "", inplace=True)

但是结果并不令人满意,因为数字格式丢失了:

------------  ---  ------------------  ------------------  ---  ----  ---
sepal_length  150
sepal_width   150  3.0573333333333337  0.4358662849366982  2.0  3.0   4.4
petal_length  150  3.7580000000000005  1.7652982332594662  1.0  4.35  6.9
petal_width   150  1.1993333333333336  0.7622376689603465  0.1  1.3   2.5
------------  ---  ------------------  ------------------  ---  ----  ---

期望的结果

我想要到达看起来休闲的 table :

------------  ---  -------  -----  --------  -----  ---
sepal_length  150    -        -      -         -      -
sepal_width   150    3.057    0.4    2.0000    3.0    4
petal_length  150    3.758    1.8    1.0000    4.3    7
petal_width   150    1.199    0.8    0.1000    1.3    2
------------  ---  -------  -----  --------  -----  ---

注释

  • tabulate 调用在输出 LaTeX 表的函数中使用。我的目的是看到解决方案灵活,因此 tabulate 可以接收 pandas 在不同位置缺少值,并将通过 floatfmt 传递的格式正确应用于列中的其余值。

最佳答案

使用替换:

print(tabulate(iris_summary.replace(np.nan, None), missingval='-',
               floatfmt=(".0f", ".0f", ".3f", ".1f", ".4f", ".1f", ".0f")))

输出:

------------  ---  -----  ---  ------  ---  -
sepal_length  150  -      -    -       -    -
sepal_width   150  3.057  0.4  2.0000  3.0  4
petal_length  150  3.758  1.8  1.0000  4.3  7
petal_width   150  1.199  0.8  0.1000  1.3  2
------------  ---  -----  ---  ------  ---  -

我认为missingval适用于None值,但Pandas将None转换为NaN,其中列有float dtype,因此您必须强制将 nan 替换为 None 才能获得预期的输出。

关于python - 正确处理缺失值和格式化 pandas 数据框打印以制表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71165558/

相关文章:

python - IntelliJ-IDEA 的 Python 类型检查器 - 预期类型不正确?

python - 如何从 Python 中的字符串中提取字符?

python - 如何通过 Python 中的偶数/奇数列更改列名

java - 如何更改 LocalDate 格式,生成 LocalDate,而不生成字符串

html - 如何将字母居中放置在圆圈中间以创建一种抽认卡效果?

python - 如何使一个抽象类从Python中的另一个抽象类继承?

python - 如何让 'list' (players/) 和 'detail' (players/{id}) 有不同的结果?

python - 安装没有root但使用系统python的pip

python - pandas.concat 两个数据框(一个有标题,一个没有标题)

ios - iPhone手机号码格式NSFormatter