首页 > 解决方案 > 如何从打印的数据帧字符串中加载数据帧?

问题描述

人们经常用 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中提出的具体情况。我认为我的问题不是重复的原因是我认为无法使用已经发布在这些链接上的任何解决方案(在撰写本文时) 加载示例 1中的字符串。

  1. 从字符串创建 Pandas DataFrame。请注意pd.read_csv(StringIO(s1), sep),正如此处建议的那样,它实际上不适用于Example-1。你得到以下输出。
    在此处输入图像描述

  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

标签: pythonstringpandasdataframe

解决方案


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

方法一

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”。来源信用

import pandas as pd
from io import StringIO

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

输出

在此处输入图像描述


推荐阅读