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

时间:2017-04-23 13:02:41

标签: python string python-3.x csv 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)

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

我在互联网上经常看到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 
"""

问题是:如何从字符串变量中获取一个包含DataFrame的变量,如下所示:

df1 = pandas.someToMeUnknownPandasFunction(df1_as_string)

现在让我们使用提供的函数从df1_as_string创建一个DataFrame:

df1 = pd_read_printed(df1_as_string)

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

print(df1)

给出:

    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

2 个答案:

答案 0 :(得分:9)

使用read_clipboard

df = pd.read_clipboard()

read_csv或分隔符包含一个或多个whitespace s - sep='\s+'delim_whitespace=True

from pandas.compat import StringIO

df = pd.read_csv(StringIO(df1_as_string), sep="\s+")
df = pd.read_csv(StringIO(df1_as_string), delim_whitespace=True)
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

答案 1 :(得分:4)

两种方法

选项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)

在任何一种情况下,我最终都会:

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