【问题标题】:Pandas DataFrame from raw string来自原始字符串的 Pandas DataFrame
【发布时间】:2018-07-26 03:21:49
【问题描述】:

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

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

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

提前致谢!!

【问题讨论】:

  • "StringIO seems not to be correct for this approach." - 你为什么这么认为?

标签: python string pandas dataframe


【解决方案1】:

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 StringIO 模拟IO,所以我觉得会比字符串拆分慢很多。我建议根据您的数据计时。如果您的值/单元格中也有空格,则字符串拆分将不起作用。
  • 非常感谢!!
【解决方案2】:

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”并不总是那么容易。在这种情况下,这可能不是问题。
  • 如果不是 unicode 我得到这个错误:TypeError: initial_value must be unicode or None, not str
  • 你用的是python2吗? :)
  • 你说得对,我在 Jupyter 上运行 python3,但现在我在 iPython 终端上。原来内核是python2.7。感谢您指出。
  • 确实,我使用了一个字符串作为 SamTools 执行的结果。在这种情况下, pd.read_csv(io.StringIO(unicode(results, 'utf-8')), delim_whitespace=True) 将起作用。
猜你喜欢
  • 1970-01-01
  • 2020-04-02
  • 2021-07-10
  • 2020-02-29
  • 2020-12-23
  • 1970-01-01
  • 2018-08-28
  • 2021-12-28
相关资源
最近更新 更多