将数据帧清晰地硬编码到python脚本中?

将数据帧清晰地硬编码到python脚本中?,python,pandas,dataframe,Python,Pandas,Dataframe,有没有一种干净的方法可以将数据帧硬编码为python代码,例如.py文件 我不想存储在单独的CSV中,我希望脚本文件能够自己运行,并且数据帧不是很大。我还希望在代码中明确它是什么,并且易于修改 例如: cols = ['val1', 'val2', 'val3'] rows = ['red', 'blue', 'green','orange','pink'] data = [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0]

有没有一种干净的方法可以将数据帧硬编码为python代码,例如.py文件

我不想存储在单独的CSV中,我希望脚本文件能够自己运行,并且数据帧不是很大。我还希望在代码中明确它是什么,并且易于修改

例如:

    cols = ['val1', 'val2', 'val3']
    rows = ['red', 'blue', 'green','orange','pink']
    data = [[1.0, 2.0, 3.0], [4.0, 5.0, 6.0], [7.0, 8.0, 9.0], [10.0,11.0,12.0],[13.0, 14.0,15.0]]
    pd.DataFrame(data, index=rows, columns=cols)
这是可行的,但是如果你想修改,比如说,green val2,那么很难立即找到正确的值。在某些方面稍好一些:

    cols = ['val1', 'val2', 'val3']
    rows = ['red', 'blue', 'green','orange','pink']
    data = [
    #  val1,  val2, val3
        [1.0, 2.0, 3.0],   # red
        [4.0, 5.0, 6.0],   # blue
        [7.0, 8.0, 9.0],   # green
        [10.0,11.0,12.0],  # orange
        [13.0, 14.0,15.0]] # pink
    pd.DataFrame(data, index=rows, columns=cols)

但是这需要大量的手动格式化,或者编写一个单独的数据框打印机,而且非常难看和粗糙。

根据我们的评论提供完整的答案:

from io import StringIO

data = """
col1,col2,col3
a,b,c
d,e,f
"""

s = StringIO(data)
df = pd.read_csv(s)
结果:

  col1 col2 col3
0    a    b    c
1    d    e    f

根据我们的意见提供完整答案:

from io import StringIO

data = """
col1,col2,col3
a,b,c
d,e,f
"""

s = StringIO(data)
df = pd.read_csv(s)
结果:

  col1 col2 col3
0    a    b    c
1    d    e    f
基于字符串文字使用pd.read_csv:

try: from io import StringIO  # Python 3
except: from StringIO import StringIO  # Python 2

import pandas as pd

TESTDATA = u"""\
    val1, val2, val3,   color
     1.0,  2.0,  3.0,   red
     4.0,  5.0,  6.0,   blue
     7.0,  8.0,  9.0,   green
    10.0, 11.0, 12.0,   orange
    13.0, 14.0, 15.0,   pink
"""

df = pd.read_csv(StringIO(TESTDATA), index_col=-1, sep=r",\s*", engine='python')
print(df)

# prints:
#         val1  val2  val3
# color                   
# red      1.0   2.0   3.0
# blue     4.0   5.0   6.0
# green    7.0   8.0   9.0
# orange  10.0  11.0  12.0
# pink    13.0  14.0  15.0
在sep中包含\s*意味着您可以选择使用空白对数据进行精确格式化。既然你说数据帧不是很大,为了可读性,为什么不这样做呢?但是,如果您不喜欢手动对齐,即使是对于一个小数据帧,也可以删除空格并将原始CSV内容粘贴到TESTDATA中。然后您可以从sep中删除\s*并删除engine='python',后者仅用于抑制与sep中使用正则表达式相关的警告

一个更好的版本,允许您使用printdf输出本身作为输入,而无需手动编辑,将是:

try: from io import StringIO  # Python 3
except: from StringIO import StringIO  # Python 2

import pandas as pd 

TESTDATA = u"""\
            val1  val2  val3
    color                   
    red      1.0   2.0   3.0
    blue     4.0   5.0   6.0
    green    7.0   8.0   9.0
    orange  10.0  11.0  12.0
    pink    13.0  14.0  15.0
"""

df = pd.read_csv(StringIO(TESTDATA), index_col=0, sep=r"\s+", engine='python')
print(df)
基于字符串文字使用pd.read_csv:

try: from io import StringIO  # Python 3
except: from StringIO import StringIO  # Python 2

import pandas as pd

TESTDATA = u"""\
    val1, val2, val3,   color
     1.0,  2.0,  3.0,   red
     4.0,  5.0,  6.0,   blue
     7.0,  8.0,  9.0,   green
    10.0, 11.0, 12.0,   orange
    13.0, 14.0, 15.0,   pink
"""

df = pd.read_csv(StringIO(TESTDATA), index_col=-1, sep=r",\s*", engine='python')
print(df)

# prints:
#         val1  val2  val3
# color                   
# red      1.0   2.0   3.0
# blue     4.0   5.0   6.0
# green    7.0   8.0   9.0
# orange  10.0  11.0  12.0
# pink    13.0  14.0  15.0
在sep中包含\s*意味着您可以选择使用空白对数据进行精确格式化。既然你说数据帧不是很大,为了可读性,为什么不这样做呢?但是,如果您不喜欢手动对齐,即使是对于一个小数据帧,也可以删除空格并将原始CSV内容粘贴到TESTDATA中。然后您可以从sep中删除\s*并删除engine='python',后者仅用于抑制与sep中使用正则表达式相关的警告

一个更好的版本,允许您使用printdf输出本身作为输入,而无需手动编辑,将是:

try: from io import StringIO  # Python 3
except: from StringIO import StringIO  # Python 2

import pandas as pd 

TESTDATA = u"""\
            val1  val2  val3
    color                   
    red      1.0   2.0   3.0
    blue     4.0   5.0   6.0
    green    7.0   8.0   9.0
    orange  10.0  11.0  12.0
    pink    13.0  14.0  15.0
"""

df = pd.read_csv(StringIO(TESTDATA), index_col=0, sep=r"\s+", engine='python')
print(df)

将csv作为一个文件放入您的文件中string@MadPhysicist在这种情况下,不要忘记使用io.StringIO:@r.ook。是的,您将csv作为string@MadPhysicist在这种情况下,不要忘记使用io.StringIO:@r.ook。是的,我会将数据从StringIO创建中分离出来,并将索引放在开头,就像通常所认为的那样,但是+1没有关系。这非常有效。我还在源数据框上使用了printdf,以便于复制字符串,从而避免了任何手动格式化。@argentum2f好的,让我添加一个版本的解决方案,允许未经编辑的重复使用printdf outputI,它会将数据与StringIO创建分开,并将索引放在开头,就像人们通常认为的那样,但是+1并不重要。这很有效。我还在源数据帧上使用了printdf,以便于复制字符串,从而避免了任何手动格式化。@argentum2f好的,让我添加一个版本的解决方案,允许未经编辑的重复使用printdf输出