如何从打印的数据帧字符串中加载数据帧? [复制]

Posted

技术标签:

【中文标题】如何从打印的数据帧字符串中加载数据帧? [复制]【英文标题】:How to load a dataframe from a printed dataframe string? [duplicate] 【发布时间】:2020-02-21 14:50:42 【问题描述】:

人们经常通过 print(dataframe) 的输出在 Stack Overflow 上提问。如果有一种方法可以将数据帧数据快速加载到pandas.dataframe 对象中,那就很方便了。

从数据帧字符串(可能格式正确也可能不正确)加载数据帧的最建议方法是什么?

示例 1

如果您想将以下字符串作为数据框加载,您会怎么做?

# Dummy Data
s1 = """
Client NumberOfProducts ID
A      1                2
A      5                1
B      1                2
B      6                1
C      9                1
"""

示例 2

这种类型更类似于您在csv 文件中找到的类型。

# Dummy Data
s2 = """
Client, NumberOfProducts, ID
 A, 1, 2
 A, 5, 1
 B, 1, 2
 B, 6, 1
 C, 9, 1
"""

预期输出

参考文献

注意:以下两个链接不涉及 Example-1 中提出的具体情况。我认为我的问题不是重复的原因是我认为无法使用已发布在这些链接上的任何解决方案(在撰写本文时)加载 Example-1 中的字符串。

    Create Pandas DataFrame from a string。请注意,这里建议的 pd.read_csv(StringIO(s1), sep) 并不真正适用于 Example-1。您会得到以下输出。

    这个问题被标记为两个 Stack Overflow 链接的副本。其中之一是上述的,它未能解决 Example-1 中提出的情况。第二个是。在那里提供的所有答案中,只有一个看起来可能适用于 Example-1,但它不起作用。

# could not read the clipboard and threw error
pd.read_clipboard(sep='\s\s+')

抛出的错误:

PyperclipException: 
    Pyperclip could not find a copy/paste mechanism for your system.
    For more information, please visit https://pyperclip.readthedocs.org

【问题讨论】:

@yatu 我更喜欢使用你提到的方法 2,但是,它无法从 Example-1 正确加载数据。这就是为什么我打开了这个问题并留下了对类似问题的引用,但问题的内容却不一样。 第一次使用df = pd.read_clipboard(sep='\s+') 进行了测试,对我来说效果很好 我尝试了pd.read_clipboard(sep='\s+') 并得到与pd.read_clipboard(sep='\s\s+') 相同的错误。我认为这是特定于系统配置的。 是的,我同意,看来问题出在您的 pc/nb 中的剪贴板。 好的。我担心的是,如果 marked-a-duplicate 这个问题将来会被删除。我刚刚检查了meta,看起来这不会发生。所以,我也没事。 meta.***.com/questions/320522/… 【参考方案1】:

我可以建议两种方法来解决这个问题。

方法一

使用regexnumpy 处理字符串以制作数据帧。我所看到的是,这在大多数情况下都有效。这将适用于“示例 1”中介绍的情况。

# Make Dataframe
import pandas as pd
import numpy as np
import re

# Make Dataframe
# s = s1
ncols = 3 # number_of_columns
ss = re.sub('\s+',',',s.strip())
sa = np.array(ss.split(',')).reshape(-1,ncols)
df = pd.DataFrame(dict((k,v) for k,v in zip(sa[0,:], sa[1:,].T)))
df

方法-2

使用io.StringIO 输入pandas.read_csv()。但如果分隔符定义明确,这将起作用。例如,如果您的数据看起来类似于“Example-2”。 Source credit

import pandas as pd
from io import StringIO

# Make Dataframe
# s = s2
df = pd.read_csv(StringIO(s), sep=',')

输出

【讨论】:

我认为第一个解决方案是有问题的,因为get alwyas strings,第二个很好,不幸的是它被骗了。 @jezrael 但是,如果您尝试将第二个用于 Example-1 中的数据,则它不起作用。因此,这个问题揭示了如何处理这种情况。还是重复的吗? 我想是的,这是骗人的。也许也有可能找到更好的骗局。 也许更通用的解决方案被添加到欺骗中。 我完全支持不要弄乱问题堆栈。但是,已标记为该问题重复的解决方案,它们没有解决我为示例 1 提出的问题。我错过了什么吗?

以上是关于如何从打印的数据帧字符串中加载数据帧? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

当我在 python 中加载数据帧时出现 UnicodeDecodeError [重复]

如何使用 Spark 数据帧将 csv 数据加载到配置单元中?

无法从引发 serde 异常的 spark 将数据帧保存为配置单元表

无法在嵌套循环中使用 pandas 附加更大的数据帧。如何更改为 numpy 向量化?

在 Delphi 6 中加载特定帧会导致它立即退出

Pandas:如何将多个数据帧作为 HTML 表格引用和打印