【问题标题】:Pandas DataFrames: how to wrap text with no whitespacePandas DataFrames:如何包装没有空格的文本
【发布时间】:2015-12-20 00:40:19
【问题描述】:

我正在 Jupyter Notebook 中查看 Pandas DataFrame,我的 DataFrame 包含的 URL 请求字符串可能长达数百个字符,没有任何空格分隔字符。

Pandas 似乎只有在有空格时才会在单元格中换行,如附图所示:

如果没有空格,则字符串显示在一行中,如果没有足够的空间,我的选择是查看 '...' 或者我必须将 display.max_colwidth 设置为一个巨大的数字,现在我有一个难以阅读的表格,滚动很多。

有没有办法强制 Pandas 换行,比如每 100 个字符,不管是否有空格?

【问题讨论】:

标签: python pandas ipython


【解决方案1】:

你可以设置

import pandas as pd
pd.set_option('display.max_colwidth', 0)

然后每一列将与需要的一样大以充分显示其内容。但它不会换行单元格的内容(除非它们包含空格)。

【讨论】:

  • 只是想我会添加等效的特定于上下文的方式:with pd.option_context('display.max_colwidth', 0):
  • 这和问题有什么关系???你的包装在哪里?
  • @matanster +1 !
  • 哇! +1 - 我很惊讶。
  • @paulo.filip3 是否有类似的方法来确保包装文本显示?不以任何方式更改数据本身,例如添加 \n.
【解决方案2】:

你可以使用str.wrap方法:

df['user_agent'] = df['user_agent'].str.wrap(100) #to set max line width of 100

【讨论】:

    【解决方案3】:

    先尝试换行,然后执行下面的函数。 top-voted answer 不能有效地换行。

    通过使用pd.set_option('display.max_colwidth', 0),它会像这样无效地换行:

    但是,通过使用以下代码,它将有效地将文本换行到任何列宽:

    from IPython.display import display, HTML
    
    def wrap_df_text(df):
        return display(HTML(df.to_html().replace("\\n","<br>")))
    
    df['user_agent'] = df['user_agent'].str.wrap(30)
    wrap_df_text(df)
    display(df)
    

    【讨论】:

      【解决方案4】:

      您可以使用数据的前 100 个字符创建一个新列

      data['new_column'] = [i[:100] for i in data['old_column']]
      

      【讨论】:

      • 无话可说! (你很幸运,我不喜欢投反对票!:)
      【解决方案5】:

      如果您不介意在将整个内容放入数据框之前解决此问题,您可以按照here 中的描述进行操作。在您的特定情况下,如果您希望每行长度为 10 个字符,您将:

      # Input
      line = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0; GomezAgent 3.0) 
      like Gecko'
      n = 10
      
      # Split
      line = [line[i:i+n] for i in range(0, len(line), n)]
      
      # The rest is easy
      df = pd.DataFrame(line)
      print(df)
      

      没有空格,你会得到:

      顺便说一句,最后一行开头的空白是因为没有 10 个字符来填充该行,就像前面的行中那样。在 jupyter 中,您可以使用 df.style.set_properties(**{'text-align': 'left'}) 来解决这个问题:

      【讨论】:

        【解决方案6】:

        如果您只是为了在 Jupyter 中进行临时临时显示,您可以简单地每 100 个字符插入一次空格:

        chunk_size = 100
        
        data['new_column'] = [' '.join([val[0+i:chunk_size+i] for i in range(0, len(string), chunk_size)] for val in data['old_column']
        

        虽然看起来这是一个问题的原因首先是因为多个功能被折叠到一个列中。如果没有看到更大的数据集,很难说,但如果它们都遵循相同的模式,我强烈建议将其拆分为多个功能(浏览器、浏览器版本、操作系统、操作系统版本等),这将使任何额外的工作使用这个数据集更容易。

        【讨论】:

        • 1) 整个 data['new_column'] = 行产生语法错误 2) 'string' 未定义!你在发布之前检查你的代码吗???这个答案值得 100 票反对,但我不喜欢反对。
        • + @Apostolos 评论
        猜你喜欢
        • 2011-08-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-18
        • 1970-01-01
        • 2011-03-15
        • 2010-09-25
        相关资源
        最近更新 更多