在打印时指定熊猫DataFrame列之间的间隔数

哈罗德·芬奇

当您打印一个熊猫DataFrame并调用DataFrame.to_string时,通常在列之间至少插入2个空格。例如,这段代码

import pandas as pd

df = pd.DataFrame( {
    "c1" : ("a", "bb", "ccc", "dddd", "eeeeee"),
    "c2" : (11, 22, 33, 44, 55),
    "a3235235235": [1, 2, 3, 4, 5]
} )
print(df)

输出

       c1  c2  a3235235235
0       a  11            1
1      bb  22            2
2     ccc  33            3
3    dddd  44            4
4  eeeeee  55            5

每列之间至少要有2个空格。

我正在复制打印在控制台上的DataFarames并将其粘贴到文档中,并且我收到了很难理解的反馈:人们希望在列之间留出更多的空间。

有没有标准的方法可以做到这一点?

我在DataFrame.to_stringpandas.set_option中都看不到任何选项

我已经进行了一次网络搜索,但没有找到答案。这个问题问如何删除这2个空格,而这个问题问为什么有时列之间只有1个空格而不是2个空格(我也已经看到了这个bug,希望有人回答这个问题)。

我的黑客解决方案是定义一个函数,该函数将DataFrame的列转换为str类型,然后为每个元素加上指定数量的空格字符串。

此代码(添加到上面的代码中)

def prependSpacesToColumns(df: pd.DataFrame, n: int = 3):
    spaces = ' ' * n
    
    # ensure every column name has the leading spaces:
    if isinstance(df.columns, pd.MultiIndex):
        for i in range(df.columns.nlevels):
            levelNew = [spaces + str(s) for s in df.columns.levels[i]]
            df.columns.set_levels(levelNew, level = i, inplace = True)
    else:
        df.columns = spaces + df.columns
    
    # ensure every element has the leading spaces:
    df = df.astype(str)
    df = spaces + df
    
    return df

dfSp = prependSpacesToColumns(df, 3)
print(dfSp)

输出

          c1     c2    a3235235235
0          a     11              1
1         bb     22              2
2        ccc     33              3
3       dddd     44              4
4     eeeeee     55              5

这是理想的效果。

但是我认为,熊猫当然必须具有一些内置的简单标准方法才能做到这一点。我想念吗?

另外,该解决方案需要处理其列为MultiIndex的DataFrame。要继续代码示例,请考虑以下修改:

idx = (("Outer", "Inner1"), ("Outer", "Inner2"), ("Outer", "a3235235235"))
df.columns = pd.MultiIndex.from_tuples(idx)
洛兹

您可以通过以下方式完成此操作formatters创建字典需要一些代码{'col_name': format_string}找到每列中的最大字符长度或列标题的长度(以较大者为准),添加一些填充,然后传递格式字符串。

使用partialfrom,functools因为格式化程序需要一个参数函数,但是我们需要为每一列指定不同的宽度。

样本数据

import pandas as pd
df = pd.DataFrame({"c1": ("a", "bb", "ccc", "dddd", 'eeeeee'),
                   "c2": (1, 22, 33, 44, 55),
                   "a3235235235": [1,2,3,4,5]})

代码

from functools import partial

# Formatting string 
def get_fmt_str(x, fill):
    return '{message: >{fill}}'.format(message=x, fill=fill)

# Max character length per column
s = df.astype(str).agg(lambda x: x.str.len()).max() 

pad = 6  # How many spaces between 
fmts = {}
for idx, c_len in s.iteritems():
    fill = max(len(str(idx)), c_len) + pad - 1
    fmts[idx] = partial(get_fmt_str, fill=fill)

print(df.to_string(formatters=fmts))

            c1      c2      a3235235235
0            a       1                1
1           bb      22                2
2          ccc      33                3
3         dddd      44                4
4       eeeeee      55                5

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章