sha*_*ker 11 python printing string python-3.x pandas
我有一个Pandas DataFrame,其中一列包含字符串元素,这些字符串元素包含我想按字面打印的新行.但它们只是出现\n在输出中.
也就是说,我想打印这个:
pos bidder
0 1
1 2
2 3 <- alice
<- bob
3 4
Run Code Online (Sandbox Code Playgroud)
但这就是我得到的:
pos bidder
0 1
1 2
2 3 <- alice\n<- bob
3 4
Run Code Online (Sandbox Code Playgroud)
我怎样才能完成我想要的?我可以使用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)
Run Code Online (Sandbox Code Playgroud)
yon*_*jie 18
.set_properties()和 CSSwhite-space属性[用于 IPython 笔记本]
另一种方法是使用 pandas 的pandas.io.formats.style.Styler.set_properties()方法和 CSS"white-space": "pre-wrap"属性:
from IPython.display import display
# Assuming the variable df contains the relevant DataFrame
display(df.style.set_properties(**{
'white-space': 'pre-wrap',
})
Run Code Online (Sandbox Code Playgroud)
要保持文本左对齐,您可能需要添加'text-align': 'left'如下内容:
from IPython.display import display
# Assuming the variable df contains the relevant DataFrame
display(df.style.set_properties(**{
'text-align': 'left',
'white-space': 'pre-wrap',
})
Run Code Online (Sandbox Code Playgroud)
uns*_*ted 13
如果您尝试在ipython笔记本中执行此操作,则可以执行以下操作:
from IPython.display import display, HTML
def pretty_print(df):
return display( HTML( df.to_html().replace("\\n","<br>") ) )
Run Code Online (Sandbox Code Playgroud)
小智 6
有点符合 unsorted 的回答:
import pandas as pd
# Save the original `to_html` function to call it later
pd.DataFrame.base_to_html = pd.DataFrame.to_html
# Call it here in a controlled way
pd.DataFrame.to_html = (
lambda df, *args, **kwargs:
(df.base_to_html(*args, **kwargs)
.replace(r"\n", "<br/>"))
)
Run Code Online (Sandbox Code Playgroud)
这样,您就不需要在 Jupyter 笔记本中调用任何显式函数,就像to_html内部调用的那样。如果您想要原始函数,请调用base_to_html(或任何您命名的函数)。
我正在使用jupyter 1.0.0,notebook 5.7.6。
来自 pandas.DataFrame文档:
带有标记轴(行和列)的二维大小可变、可能异构的表格数据结构。算术运算在行标签和列标签上对齐。可以被认为是 Series 对象的类似字典的容器。pandas 的主要数据结构
所以你不能有没有索引的行。换行符“\n”在 DataFrame 中不起作用。
您可以用空值覆盖“pos”,并在下一行输出下一个“bidder”。但是每次这样做时索引和'pos'都会被抵消。喜欢:
pos bidder
0 1
1 2
2 3 <- alice
3 <- bob
4 5
Run Code Online (Sandbox Code Playgroud)
因此,如果名为“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)
Run Code Online (Sandbox Code Playgroud)
编辑:
另一种选择是重组数据和输出。您可以将 pos 作为列,并为数据中的每个键/人创建一个新行。在下面的代码示例中,它打印 DataFrame,并将 NaN 值替换为空字符串。
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])
Run Code Online (Sandbox Code Playgroud)
但这取决于您想如何处理数据。祝你好运 :)
| 归档时间: |
|
| 查看次数: |
8782 次 |
| 最近记录: |