从原始字符串创建Pandas DataFrame

4

我有一个字符串,看起来像这样:

a1\tb1\tc1\na2\tb2\tc2\na3\tb3\tc3\n...

有一种高效而智能的方法将这种字符串转换为Pandas DataFrame吗?StringIO似乎不适合这种方法。
提前感谢!

1
“StringIO似乎不适合这种方法。” - 你为什么这样认为? - MaxU - stand with Ukraine
2个回答

8

StringIO可以完美地工作。

import io

string = 'a1\tb1\tc1\na2\tb2\tc2\na3\tb3\tc3'
pd.read_csv(io.StringIO(string), delim_whitespace=True, header=None)

    0   1   2
0  a1  b1  c1
1  a2  b2  c2
2  a3  b3  c3

您也可以使用pd.read_tablepd.read_fwf以相同的方式:

pd.read_table(io.StringIO(string), header=None)

或者,
pd.read_fwf(io.StringIO(string), header=None)

    0   1   2
0  a1  b1  c1
1  a2  b2  c2
2  a3  b3  c3

在这两个例子中,我们假设空格是自然的分隔符。但是,在数据中,您的原始字符串必须保持一致的结构。
最后,您还可以使用字符串分割的方法,首先按换行符进行分割,然后再按制表符进行分割:
pd.DataFrame(list(map(str.split, string.splitlines())))

    0   1   2
0  a1  b1  c1
1  a2  b2  c2
2  a3  b3  c3

非常感谢您的帮助。问题在于我没有编写Unicode转换和delim_whitespace。顺便问一下,您认为哪种方法更有效和快速:分割方法还是read_csv?谢谢! - P. Solar
@P.Solar StringIO 模拟 IO,因此我认为它比字符串分割要慢得多。我建议在您的数据上计时。如果您的值/单元格中也有空格,则无法使用字符串分割。 - cs95
非常感谢您!! - P. Solar

3

Python 2.7

您只需要指定分隔符为 sep='\t' 并将字符串转换为Unicode格式以避免错误:

 pd.read_csv(io.StringIO(u'a1\tb1\tc1\na2\tb2\tc2\na3\tb3\tc3'), 
             sep="\t", header=None)
    0   1   2
0  a1  b1  c1
1  a2  b2  c2
2  a3  b3  c3

当你从某些外部来源接收数据时,“将字符串转换为Unicode”并不总是那么容易。在这种情况下可能不是问题。 - cs95
如果不是Unicode,我会得到这个错误:TypeError: initial_value must be unicode or None, not str - Mabel Villalba
1
你在使用Python2吗? :) - cs95
你说得对,我在Jupyter上运行的是Python3,但现在我在iPython终端上。结果发现内核是Python2.7。谢谢你指出来。 - Mabel Villalba
事实上,我正在使用字符串作为SamTools执行的结果。在这种情况下,pd.read_csv(io.StringIO(unicode(results, 'utf-8')), delim_whitespace=True)将起作用。 - P. Solar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接