Pandas在没有空间的文件上读取\u csv?

2024-04-29 05:19:40 发布

您现在位置:Python中文网/ 问答频道 /正文

给定一组如下所示的数据,每行长度为10个字符。它们是网络的链路,由4个或5个字符的节点号组成。下面是我将面临的情况的一个例子:

| 106374652 |

| 1038 1037 |

| 7061219637 |

| 82004 2082 |

由于数据集不太关心间距,而第1、2和4行可以通过sep=''或delim_whitespace=True轻松读取,因此我恐怕无法对第3行执行相同的操作。由于输入数据文件是由第三方软件生成的,所以我对它几乎无能为力 (除了在Excel中进行一些格式化,这似乎违反直觉……)请问,Pandas中是否有允许我指定字符数(在我的示例中为5)作为分隔符的内容

非常感谢你的建议


Tags: 数据网络true节点软件数据文件情况链路
3条回答

我想你要找的是^{}读取一个固定宽度的文件。在这种情况下,您可以指定列规格:

pd.read_fwf(io.StringIO('''|10637 4652|
| 1038 1037|
|7061219637|
|82004 2082|'''), colspecs=[(1, 6), (6, 11)], header=None)

列规范为0索引和端排他。您也可以使用widths参数,但在剥离|之前,我会避免使用它,以确保正确地将变量读入为数字,而不是以管道开头或结尾的字符串

在这种情况下,这将产生:

       0      1
0  10637   4652
1   1038   1037
2  70612  19637
3  82004   2082

我通过了header=None,因为您的示例数据中缺少头。您可能需要根据需要进行调整。我还把你输入的所有空白线都删去了。如果输入中实际上有空行,那么我将首先运行:'\n'.join((s for s in input_string.split('\n') if len(s.strip()) != 0)),然后将其传递给解析。在这里,您还需要首先将文件作为字符串加载,清理它,然后使用io.StringIO将其传递给read_fwf

使用read_csv,可以将sep指定为一组4或5位数字,然后只保留带有数字的列

from io import StringIO

s = '''
|10637 4652|
| 1038 1037|
|7061219637|
|82004 2082|
'''
print(
    pd.read_csv(StringIO(s), sep='(\d{4,5})', 
                engine='python', usecols=[1,3],
                index_col=False, header=None)
)
       1      3
0  10637   4652
1   1038   1037
2  70612  19637
3  82004   2082

或者,您可以加载数据并使用textwrap模块的高级功能,只需指定宽度,它就会为您生成列

import textwrap
df['<col_name>'].apply(textwrap.wrap, width = 5).apply(pd.Series)

输出:

    0        1
0   10637   4652
1   1038    1037
2   70612   19637
3   82004   2082

相关问题 更多 >