如何从print()编写的字符串中获取Python pandas DataFrame?

Cla*_*dio 7 python csv string python-3.x pandas

这是一个提供便利功能的问题的更新版本

pd_read_printed(str_printed_df)

旨在从之前使用print(some_pandas_DataFrame)编写的字符串中创建一个pandas DataFrame:

def pd_read_printed(str_printed_df):
    global pd, StringIO
    try: x = pd
    except: import pandas as pd
    try: x = StringIO
    except: from pandas.compat import StringIO
    return pd.read_csv(StringIO(str_printed_df), delim_whitespace=True)
Run Code Online (Sandbox Code Playgroud)

在我得到以下问题的答案之后,我把它放在一起供自己使用:

我在互联网上经常看到pandas DataFrame在其印刷版中的内容,例如::

df1_as_string = """
 Sp   Mt   Value  count
4  MM2  S4   bg     10
5  MM2  S4   dgd    1
6  MM4  S2   rd     2
7  MM4  S2   cb     8
8  MM4  S2   uyi    8 
"""
Run Code Online (Sandbox Code Playgroud)

问题是:如何从类似以下样式的字符串变量中获取保存DataFrame的变量:

df1 = pandas.someToMeUnknownPandasFunction(df1_as_string)
Run Code Online (Sandbox Code Playgroud)

现在让我们使用提供的函数从df1_as_string以下位置创建DataFrame :

df1 = pd_read_printed(df1_as_string)
Run Code Online (Sandbox Code Playgroud)

并检查它是否按预期工作:

print(df1)
Run Code Online (Sandbox Code Playgroud)

得到:

    Sp  Mt Value  count
4  MM2  S4    bg     10
5  MM2  S4   dgd      1
6  MM4  S2    rd      2
7  MM4  S2    cb      8
8  MM4  S2   uyi      8
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 10

使用read_clipboard.

df = pd.read_clipboard()
Run Code Online (Sandbox Code Playgroud)

或者read_csv使用分隔符一个或多个whitespaces - sep='\s+'delim_whitespace=True:

from pandas.compat import StringIO

df = pd.read_csv(StringIO(df1_as_string), sep="\s+")
Run Code Online (Sandbox Code Playgroud)
df = pd.read_csv(StringIO(df1_as_string), delim_whitespace=True)
Run Code Online (Sandbox Code Playgroud)
print (df)
    Sp  Mt Value  count
4  MM2  S4    bg     10
5  MM2  S4   dgd      1
6  MM4  S2    rd      2
7  MM4  S2    cb      8
8  MM4  S2   uyi      8
Run Code Online (Sandbox Code Playgroud)


piR*_*red 5

两种方法

选项1
pd.read_clipboard

这是我用于简单格式化数据帧的 goto 方法。我复制数据框文本并跟进df = pd.read_clipboard()

选项 2
StringIO +pd.read_csv

对于结构更复杂的数据框,我可能需要一些选项,read_csv所以我可能会这样设置。请记住,对于您提供的数据框,我几乎不会这样做,因为我获取数据框的速度较慢。

from io import StringIO
import pandas as pd

df1_as_string = """
 Sp   Mt   Value  count
4  MM2  S4   bg     10
5  MM2  S4   dgd    1
6  MM4  S2   rd     2
7  MM4  S2   cb     8
8  MM4  S2   uyi    8 
"""

df = pd.read_csv(StringIO(df1_as_string), delim_whitespace=True)
Run Code Online (Sandbox Code Playgroud)

无论哪种情况,我最终都会得到:

print(df)

    Sp  Mt Value  count
4  MM2  S4    bg     10
5  MM2  S4   dgd      1
6  MM4  S2    rd      2
7  MM4  S2    cb      8
8  MM4  S2   uyi      8
Run Code Online (Sandbox Code Playgroud)