首页 > 解决方案 > Python - Pandas - 一次打印 10 行,同时保持它们正确对齐

问题描述

pandas用来创建一个数据框并一次打印 10 行。如果用户回答是打印更多,那么我打印接下来的 10 行。这可行,但在部分中打印会破坏对齐。我想知道是否有一种方法可以保持对齐,同时仍然一次只打印 10 行。

start_row = 0
end_row = 10
print((df[start_row:end_row]).to_string(index=False))
    while end_row < max_rows:
        if user_input("Add More Results? (YES/NO)") == "yes":
            # Deletes the question after "yes" input to make a more readable list
            print("\033[A                             \033[A")

            start_row += 10
            end_row += 10
            print((df[start_row:end_row]).to_string(index=False, header=False))
        else:
            print("\n")
            break
    else:
        end_row = max_rows
        print("\nEnd of List\n")

结果看起来像这样,一团乱麻。

标签: pythonpandasdataframetext-alignment

解决方案


您可以尝试通过以下方式格式化输出formatters

# Outside the loop
formatters = {col: (lambda x: f'{x:>{max(len(str(y)) for y in df[col]) + 2}}')
              for col in df.columns}

# In the loop
print(df[start_row:end_row].to_string(index=False, header=False, formatters=formatters))

编辑:经过一番考虑,我认为这是一个更强大的版本:

formatters = {col: (lambda x: str(x).rjust(max(len(str(y)) for y in df[col]) + 2))
              for col in df.columns}

这应该将输出始终向右对齐,以便左侧至少有 2 个空白填充(通过>格式字符串)。您当然可以将其更改2为您想要的任何内容。

带样品架

df = pd.DataFrame({'Col1': [0, 1, 1000, 1001], 'Col2': [0, 1, 10000, 10001]})
   Col1   Col2
0     0      0
1     1      1
2  1000  10000
3  1001  10001

这个

start_row, end_row = 0, 2
print(df[start_row:end_row].to_string(index=False, header=False))
start_row, end_row = 2, 4
print(df[start_row:end_row].to_string(index=False, header=False))

导致

 0  0
 1  1
 1000  10000
 1001  10001

而这

start_row, end_row = 0, 2
print(df[start_row:end_row].to_string(index=False, header=False, formatters=formatters))
start_row, end_row = 2, 4
print(df[start_row:end_row].to_string(index=False, header=False, formatters=formatters))

导致

      0       0
      1       1
   1000   10000
   1001   10001

当然,您也可以为每列使用单独的函数。例如这个

formatters = {'Col1': (lambda x: str(x).rjust(max(len(str(y)) for y in df['Col1']) + 2)),
              'Col2': (lambda x: str(x).ljust(max(len(str(y)) for y in df['Col2']) + 2))}

导致

     0 0      
     1 1      
  1000 10000  
  1001 10001  

或者您只能为选定的列定义函数。但这有可能导致整体奇怪的输出,因为列宽从左到右累积。


推荐阅读