我将@unutbu 的方法转换为一个函数,以便我可以左对齐我的数据框。
my_df = pd.DataFrame({'StringVals': ["Text string One", "Text string Two", "Text string Three"]})
def left_justified(df):
formatters = {}
for li in list(df.columns):
max = df[li].str.len().max()
form = "{{:<{}s}}".format(max)
formatters[li] = functools.partial(str.format, form)
return df.to_string(formatters=formatters, index=False)
所以现在这样:
print(my_df.to_string())
StringVals
0 Text string One
1 Text string Two
2 Text string Three
变成这样:
print(left_justified(my_df))
StringVals
Text string One
Text string Two
Text string Three
但是,请注意,数据框中的任何非字符串值都会给您错误:
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
如果您希望它使用非字符串值,您必须将不同的格式字符串传递给.to_string():
my_df2 = pd.DataFrame({'Booleans' : [False, True, True],
'Floats' : [1.0, 0.4, 1.5],
'StringVals': ["Text string One", "Text string Two", "Text string Three"]})
FLOAT_COLUMNS = ('Floats',)
BOOLEAN_COLUMNS = ('Booleans',)
def left_justified2(df):
formatters = {}
# Pass a custom pattern to format(), based on
# type of data
for li in list(df.columns):
if li in FLOAT_COLUMNS:
form = "{{!s:<5}}".format()
elif li in BOOLEAN_COLUMNS:
form = "{{!s:<8}}".format()
else:
max = df[li].str.len().max()
form = "{{:<{}s}}".format(max)
formatters[li] = functools.partial(str.format, form)
return df.to_string(formatters=formatters, index=False)
使用浮点数和布尔值:
print(left_justified2(my_df2))
Booleans Floats StringVals
False 1.0 Text string One
True 0.4 Text string Two
True 1.5 Text string Three
请注意,这种方法有点小技巧。您不仅必须在单独的列表中维护列名,而且还必须对数据宽度进行最佳猜测。也许有更好的 Pandas-Fu 的人可以演示如何自动解析数据帧信息以自动生成格式。