Python - Pandas - 一次打印 10 行,同时保持它们正确对齐
Python - Pandas - Print 10 rows at a time while keeping them properly aligned
我正在使用 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("3[A 3[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")
result looks like this,未对齐的混乱。
您可以尝试通过 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
或者您只能为选定的列定义函数。但这有可能导致整体奇怪的输出,因为列宽从左到右累积。
我正在使用 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("3[A 3[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")
result looks like this,未对齐的混乱。
您可以尝试通过 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
或者您只能为选定的列定义函数。但这有可能导致整体奇怪的输出,因为列宽从左到右累积。