在熊猫csv读取时处理未知的列数

时间:2019-10-03 13:31:26

标签: python-3.x pandas

我从stdin那里得到了数据,

x
x
x    y
x
x    y    z
...

并且我想基于该输入创建pandas DataFrame

df = pd.read_csv(sys.stdin, sep='\t', header=None)

,但是这里的问题是我第三行的数据具有比第一行更多的值,而且我得到了

  

pandas.errors.ParserError:标记数据时出错。 C错误:第3行中应有1个字段,看到了2

问题是:当我不知道最长的元素链(由\t分隔)时,如何处理此错误。

1 个答案:

答案 0 :(得分:1)

整个任务可以用指令执行, 不计算每一行中的元素。

我准备了一个这样的示例,使用 io.StringIO

df = pd.DataFrame([ ln.rstrip().split('\t') for ln in
    io.StringIO(txt).readlines() ]).fillna('')

列表理解将每个源行转换为一个列表 片段(在 Tab 之间)

然后,此列表理解项是 pd.DataFrame data 参数 并请注意,这样的行列表可以包含不同长度的行。

我还添加了 fillna('')将每个 NaN 转换为空字符串 (您可以随意删除它)。

要运行测试,我将源变量定义为:

txt = '''x
x
x   y
x
x   y   z
x
x   y   z   v'''

结束执行上面的代码,得到:

   0  1  2  3
0  x         
1  x         
2  x  y      
3  x         
4  x  y  z   
5  x         
6  x  y  z  v

在目标版本中,将字符串中的读数替换为 stdin