在Pandas DataFrame的字符串中漂亮地打印换行符

发布于 2021-01-29 18:23:17

我有一个Pandas DataFrame,其中的一列中包含字符串元素,而这些字符串元素包含我想实际打印的新行。但是它们只是出现\n在输出中。

也就是说,我要打印此:

  pos     bidder
0   1
1   2
2   3  <- alice
       <- bob
3   4

但这就是我得到的:

  pos            bidder
0   1
1   2
2   3  <- alice\n<- bob
3   4

我该如何完成我想要的?我可以使用DataFrame,还是必须恢复为手动打印填充的列一次一次?

这是我到目前为止的内容:

n = 4
output = pd.DataFrame({
    'pos': range(1, n+1),
    'bidder': [''] * n
})
bids = {'alice': 3, 'bob': 3}
used_pos = []
for bidder, pos in bids.items():
    if pos in used_pos:
        arrow = output.ix[pos, 'bidder']
        output.ix[pos, 'bidder'] = arrow + "\n<- %s" % bidder
    else:
        output.ix[pos, 'bidder'] = "<- %s" % bidder
print(output)
关注者
0
被浏览
242
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    从pandas.DataFrame文档中

    具有标注轴(行和列)的二维大小可变的,可能是异构的表格数据结构。算术运算在行和列标签上对齐。可以认为是Series对象的类似dict的容器。大熊猫主要数据结构

    因此,没有索引就不能有一行。换行符“ \ n”在DataFrame中不起作用。

    您可以用空值覆盖“ pos”,然后在下一行输出下一个“ bidder”。但是,每次这样做时,index和’pos’都会被抵消。喜欢:

      pos    bidder
    0   1          
    1   2          
    2   3  <- alice
    3        <- bob
    4   5
    

    因此,如果一个名为“ frank”的竞标者的价值为4,它将覆盖“
    bob”。当您添加更多时,这会引起问题。可能可以使用DataFrame并编写代码来解决此问题,但可能值得研究其他解决方案。

    这是产生上面输出结构的代码。

    import pandas as pd
    
    n = 5
    output = pd.DataFrame({'pos': range(1, n + 1),
                          'bidder': [''] * n},
                          columns=['pos', 'bidder'])
    bids = {'alice': 3, 'bob': 3}
    used_pos = []
    for bidder, pos in bids.items():
        if pos in used_pos:
            output.ix[pos, 'bidder'] = "<- %s" % bidder
            output.ix[pos, 'pos'] = ''
        else:
            output.ix[pos - 1, 'bidder'] = "<- %s" % bidder
            used_pos.append(pos)
    print(output)
    

    编辑:

    另一个选择是重组数据和输出。您可以将pos作为列,并为数据中的每个键/人创建一个新行。在下面的代码示例中,它打印出NaN值替换为空字符串的DataFrame。

    import pandas as pd
    
    data = {'johnny\nnewline': 2, 'alice': 3, 'bob': 3,
            'frank': 4, 'lisa': 1, 'tom': 8}
    n = range(1, max(data.values()) + 1)
    
    # Create DataFrame with columns = pos
    output = pd.DataFrame(columns=n, index=[])
    
    # Populate DataFrame with rows
    for index, (bidder, pos) in enumerate(data.items()):
        output.loc[index, pos] = bidder
    
    # Print the DataFrame and remove NaN to make it easier to read.
    print(output.fillna(''))
    
    # Fetch and print every element in column 2
    for index in range(1, 5):
        print(output.loc[index, 2])
    

    但是,这取决于您要如何处理数据。祝好运 :)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看