通常人们会用print(dataframe)输出在Stack Overflow上提问。如果人们有一种方法可以将数据帧数据快速加载到pandas.dataframe
对象中,则很方便。
从数据帧字符串(可能会或可能未正确格式化)中加载数据帧的最建议方式是什么?
如果要将以下字符串作为数据帧加载,怎么办?
# Dummy Data
s1 = """
Client NumberOfProducts ID
A 1 2
A 5 1
B 1 2
B 6 1
C 9 1
"""
此类型与您在csv
文件中找到的类型更相似。
# Dummy Data
s2 = """
Client, NumberOfProducts, ID
A, 1, 2
A, 5, 1
B, 1, 2
B, 6, 1
C, 9, 1
"""
注意:以下两个链接未解决示例1 中显示的特定情况。我认为我的问题不是重复的原因是,我认为不能使用那些链接上已经发布的任何解决方案(在撰写本文时)在 Example-1 中加载字符串。
Create Pandas DataFrame from a string。请注意,如此处建议的,pd.read_csv(StringIO(s1), sep)
不适用于 Example-1 。您将获得以下输出。
此问题被标记为两个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
答案 0 :(得分:0)
我可以建议两种方法来解决此问题。
用regex
和numpy
处理字符串以构成数据框。我所看到的是,这在大多数情况下都有效。对于“示例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
使用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=',')