在pandas数据框中完整打印非常长的字符串

209

我在处理一个看似非常简单的事情。我有一个包含非常长字符串的pandas数据框。

df = pd.DataFrame({'one' : ['one', 'two', 
      'This is very long string very long string very long string veryvery long string']})

现在当我尝试打印相同内容时,我看不到完整的字符串,而只能看到部分字符串。

我尝试了以下选项:

  • 使用print(df.iloc[2])
  • 使用to_html
  • 使用to_string
  • Stack Overflow中的某个回答建议通过使用pandas显示选项来增加列宽,但也没有奏效。
  • 我也不明白如何使用set_printoptions来解决这个问题。
9个回答

271
你可以使用options.display.max_colwidth来指定你想在默认表示中看到更多内容:
In [2]: df
Out[2]:
                                                 one
0                                                one
1                                                two
2  This is very long string very long string very...

In [3]: pd.options.display.max_colwidth
Out[3]: 50

In [4]: pd.options.display.max_colwidth = 100

In [5]: df
Out[5]:
                                                                               one
0                                                                              one
1                                                                              two
2  This is very long string very long string very long string veryvery long string

实际上,如果您只想检查一个值,通过访问它(作为标量,而不是像df.iloc[2]一样作为行)也可以看到完整的字符串:

In [7]: df.iloc[2,0]    # or df.loc[2,'one']
Out[7]: 'This is very long string very long string very long string veryvery long string'

2
df.iloc[2,0] -- 不起作用 - 我将打印第一行和第三行并进行切割。 - Rocketq
可以了,谢谢!我有一个邮政编码列表在1列中,并使用apply函数来查找每列的最小值和最大值:df['zipcodeMinMax'] = df.loc[:,['zipcodeList']].apply(createMinMaxZipcode, axis=1)。因此,在函数内部,我对系列进行to_string操作(stringZipcodes = zipcodeList.to_string(header=False, index=False))。更长的邮政编码列表会在末尾产生3个点,例如“1111...”。如果基于索引和列(作为标量)选择值,则不会发生这种情况。我的问题是:为什么会出现这种行为?设置显示选项以影响apply对我来说似乎很奇怪?谢谢! - Wouter
为了确保系列中字符串的长度足够,我添加了以下内容:colwidth = 500 pd.set_option('max_colwidth',colwidth) if df['zipcodeList'].str.len().max() > colwidth: raise ValueError ('最大宽度小于邮政编码字符串的最大长度') - Wouter
2
@Wouter 如果你有其他问题,最好提出一个新的问题,而不是在这里评论。 - joris
2
这对于一个包含多行的段落等较大字符串不起作用。 - devssh
显示剩余2条评论

110

使用 pd.set_option('display.max_colwidth', None) 实现自动换行和多行单元格。

这里 是一份关于如何充分利用jupyter和pandas显示的很好的资源。


编辑: 以前是 pd.set_option('display.max_colwidth', -1)


1
Pandas >= v1.0 的更新:使用 None 替代 -1。 - johnnybarrels

28

另一种相当简单的方法是调用list函数:

list(df['one'][2])
# output:
['This is very long string very long string very long string veryvery long string']

虽然没有什么值得一提的,但列举所有列并不太好,但对于一行简单的东西 - 为什么不呢?


1
如果您根据某些搜索条件缩小了df的范围,并且它只剩下一行,那么这种方法不起作用。无论如何,这是最简单的调试方式,我希望它能够起作用,但我不知道为什么它不起作用。您会收到“*** KeyError: 0”的错误提示。我猜想这可能与只有一个值时类似于“标量”有关。 - Starman
截至今天,这将返回一个包含查询的所有字符的df,该查询返回两个包含127个字符的单元格。我一直在努力尝试获取它们,如果有人能帮忙就好了。 - avirr
1
也可以这样写:list(df['one'])[2] - 只获取字符串,而不是列表! - user3503711

20

打印整个字符串的另一种更简单的方法是在数据框上调用values

df = pd.DataFrame({'one' : ['one', 'two', 
      'This is very long string very long string very long string veryvery long string']})

print(df.values)

输出结果将是

[['one']
 ['two']
 ['This is very long string very long string very long string veryvery long string']]

8

在打印之前,只需将以下行添加到您的代码中即可。

 pd.options.display.max_colwidth = 90  # set a value as your need

你可以按照以下步骤设置其他附加选项:
  • You can change the options for pandas max_columns feature as follows to display more columns

    import pandas as pd
    pd.options.display.max_columns = 10
    

    (this allows 10 columns to display, you can change this as you need)

  • Like that you can change the number of rows as you need to display as follows to display more rows

    pd.options.display.max_rows = 999
    

    (this allows to print 999 rows at a time)

这应该可以正常工作。

请仁慈地参考文档以更改Pandas的更多选项/设置。


7
我已经创建了一个小型实用函数,它对我很有效。
def display_text_max_col_width(df, width):
    with pd.option_context('display.max_colwidth', width):
        print(df)

display_text_max_col_width(train_df["Description"], 800)

我可以根据自己的需求更改宽度的长度,而无需永久设置任何选项。


6

如果您正在使用Jupyter Notebook,您也可以将Pandas数据框打印为HTML表格,这将打印完整的字符串。

from IPython.display import display, HTML
display(HTML(df.to_html()))

输出

    one
0   one
1   two
2   This is very long string very long string very long string veryvery long string

4
这是你想做的吗?
In [7]: x =  pd.DataFrame({'one' : ['one', 'two', 'This is very long string very long string very long string veryvery long string']})

In [8]: x
Out[8]: 
                                                 one
0                                                one
1                                                two
2  This is very long string very long string very...

In [9]: x['one'][2]
Out[9]: 'This is very long string very long string very long string veryvery long string'

3

我通常处理你所描述的情况的方式是使用.to_csv()方法并写入stdout:

import sys

df.to_csv(sys.stdout)

更新:现在可以直接使用None代替sys.stdout,效果类似!这将转储整个数据帧,包括任何字符串的全部内容。您可以使用to_csv参数配置列分隔符、是否打印索引等。但与正确呈现相比,它会更加简单粗暴。我最初发布了这篇文章,作为回答pandas中从数据框中输出所有列的数据问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接