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

时间:2019-10-25 08:59:52

标签: python string pandas dataframe

通常人们会用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
"""

预期产量

enter image description here

参考

注意:以下两个链接未解决示例1 中显示的特定情况。我认为我的问题不是重复的原因是,我认为不能使用那些链接上已经发布的任何解决方案(在撰写本文时)在 Example-1 中加载字符串。

  1. Create Pandas DataFrame from a string。请注意,如此处建议的,pd.read_csv(StringIO(s1), sep)不适用于 Example-1 。您将获得以下输出。
    enter image description here

  2. 此问题被标记为两个Stack Overflow链接的重复。其中之一就是上述情况,无法解决示例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

1 个答案:

答案 0 :(得分:0)

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

方法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=',')

输出

enter image description here