我pd.set_option("display.colheader_justify","right")
用来设置列标题。但我找不到数据的选项pd.describe_option()
。
如何设置数据框中的数据显示每列的左对齐或右对齐?或者,是否可以为整行数据显示定义格式模板?
如果要更改 Jupyter Notebook 中的显示,可以使用样式功能。
# Test data
df = DataFrame({'text': ['foo', 'bar'],
'number': [1, 2]})
df.style.set_properties(**{'text-align': 'right'})
@Romain给出的答案很好,但我想总结一些评论:
# Test data
df = DataFrame({'text': ['foo', 'bar'],'number': [1, 2]})
dfStyler = df.style.set_properties(**{'text-align': 'left'})
dfStyler.set_table_styles([dict(selector='th', props=[('text-align', 'left')])])
将对齐所有表格文本和列标题。
我不需要以相同的方式证明所有列的合理性,而是需要以不同的方式证明某些列的合理性。由于该线程中没有提及,我想提醒该subset
选项的存在:
Styler.set_properties(subset=None, **kwargs)[source]
从与 OP 相同的示例中,可以仅左对齐“文本”列:
df = pd.DataFrame({'text': ['foo', 'bar'],
'number': [1, 2]})
dfStyler = df.style.set_properties(subset=['text'],**{'text-align': 'left'})
例如,如果您想将文本和标题都向左对齐,您可以使用:
df.style.set_properties(**{'text-align': 'left'}).set_table_styles([ dict(selector='th', props=[('text-align', 'left')] ) ])
这首先将文本设置到左侧,然后设置标题。
pip3 install tabulate
from tabulate import tabulate
df = pd.DataFrame ({'Text': ['abcdef', 'x'], 'Value': [12.34, 4.2]})
print(tabulate(df, showindex=False, headers=df.columns))
Text Value
------ -------
abcdef 12.34
x 4.2
这将自动将 pandas 标题和列数据对齐到良好的视图格式。自动将 pandas 数据框列数据向左对齐。删除熊猫数据框中索引的显示。将----放在标题和列数据之间。
我将@Hagbard的答案包装在一个函数中,以便在我希望在笔记本单元格上显示包含英文文本的 pandas 数据框时使用它:
from pandas import DataFrame
def left_align(df: DataFrame):
left_aligned_df = df.style.set_properties(**{'text-align': 'left'})
left_aligned_df = left_aligned_df.set_table_styles(
[dict(selector='th', props=[('text-align', 'left')])]
)
return left_aligned_df
为了显示一个数据框,我简单地写了这个:
left_align(df.head())
注意:对于大型数据集,它会在df
没有任何抽象的情况下打印 的所有行和列,因此 Jupyter 崩溃!这就是为什么我将它与.head()
or.tail()
或其他一些限制一起使用。)
在我的情况下,我的 Pandas DataFrame 有一个类包装器。__str__()
这允许我通过自定义包装器的方法来左对齐 DataFrame 的字符串输出。
以下是我根据Unutbu 对类似问题的回答为我的应用程序解决问题的方法。Pandas DataFrame 被引用self.data
:
def __str__(self):
"""
Return the test stats report as a single string
with left-justified columns.
"""
# Columns containing boolean values need different format strings
# to avoid 'ValueError: Invalid format specifier' exceptions.
BOOL_COLUMNS = ['success',]
formatters = {}
for li in list(self.data.columns):
if li in BOOL_COLUMNS:
form = "{{!s:<5}}".format()
else:
max = self.data[li].str.len().max()
form = "{{:<{}s}}".format(max)
formatters[li] = functools.partial(str.format,form)
return self.data.to_string(formatters=formatters, index=False)
你可以通过一个新的上下文来控制它:
with pd.option_context('display.colheader_justify','right'):
...
由于使用的解决方案在控制台打印pandas.Styler
中不起作用(至少对我而言),我使用pandas 1.3.3和示例数据框提出了以下代码,打印所有字符串列左对齐(无标题):
df = pd.DataFrame({'float': [0.123, 7],
'int': [3, 357676],
'str': ["hello world", "bye"],
'cat': pd.Series(["a", "bbb"], dtype="category"),
'bool': [True, False]
})
formatters = {}
for col in df.select_dtypes("object"):
len_max = df[col].str.len().max()
formatters[col] = lambda _: f"{_:<{len_max}s}"
print(df.to_string(formatters=formatters))
float int str cat bool
0 0.123 3 hello world a True
1 7.000 357676 bye bbb False
如果您还想将标题左对齐,请添加justify='left'
. 出于某种原因,对于某些列,标题现在是一个字符太远了,但不是全部:
print(df.to_string(formatters=formatters, justify="left"))
float int str cat bool
0 0.123 3 hello world a True
1 7.000 357676 bye bbb False
但是,将此模式应用于其他 dtype 失败(也适用于字符串列)。我不知道为什么会这样。请注意,字符串转换是通过下面添加astype
的,也在 f 字符串内:
formatters = {}
for col in df.columns:
len_max = df[col].astype(str).str.len().max()
formatters[col] = lambda _: f"{_!s:<{len_max}s}"
print(col, len_max)
print(df.to_string(formatters=formatters))
float int str cat bool
0 0.123 3 hello world a True
1 7.0 357676 bye bbb False