选择 n 列,将行的其余部分添加到最后一列的末尾,使用 read_csv()

Select n columns, with the rest of line added to the end of the last column, using read_csv()

提问人:WoJ 提问时间:9/14/2023 最后编辑:MarkWoJ 更新时间:10/27/2023 访问量:95

问:

我正在使用 Pandas 读取一个用空格分隔的字段的文件。有固定数量的列,但有几行不遵循该模式。read_csv()

到目前为止,我使用的解决方案是添加跳过它们并通知我存在故障线。on_bad_lines='warn'

这没关系,虽然有几行我可以单独查看。不幸的是,这种线路的数量增加了。

我可以接受的解决方案是只加载 10 列:9 列总是好的(并且具有可预测的名称),第 10 列将行的其余部分作为一列(称为“其他所有内容”)。

我来回查看 read_csv() 的文档,但我找不到正确的参数。有没有办法限制要读入的列数(包括最后一列和行的其余部分)?

说一些上下文:我拥有的文件类型

aaax bbb ccc ddd
mmmxxx nnn ooo ppp sjkhdkjsh skdjhsksdkskjdh  ksjh sdkjsdh  ksjdh
fffxx ggg hhh iii

我想检索每行的四列,第四列是(每行)

ddd
ppp sjkhdkjsh skdjhsksdkskjdh  ksjh sdkjsdh  ksjdh
iii
python pandas 正则表达式 csv

评论

1赞 Mark 9/14/2023
这回答了你的问题吗?如何将有限数量的列加上其余行作为字符串读取到 Pandas 数据帧中?
1赞 Mark 9/14/2023
您的实际数据中是否有空格?你从什么原始格式中获取它?

答:

1赞 Mark 9/14/2023 #1

我的谦虚方法:

import pandas as pd
from io import StringIO

data = """aaax bbb ccc ddd
mmmxxx nnn ooo ppp sjkhdkjsh skdjhsksdkskjdh  ksjh sdkjsdh  ksjdh
fffxx ggg hhh iii
"""
n = 3
df = pd.read_csv(StringIO(data), sep="\s+", header=None, usecols = range(n))
df['last'] = pd.Series(data.splitlines()).str.split(n = n).str[-1]

输出:

        0    1    2                                               last
0    aaax  bbb  ccc                                                ddd
1  mmmxxx  nnn  ooo  ppp sjkhdkjsh skdjhsksdkskjdh  ksjh sdkjsdh  k...
2   fffxx  ggg  hhh                                                iii

评论

0赞 WoJ 9/14/2023
我想知道是否不要在我的问题中注明我不想选择我想使用的列,但最终决定不这样做,因为害怕混淆:)我确实尝试过使用,但这需要我在某个时候进行剪切,而没有将该行的其余部分作为最后一列。或者至少我是这样理解的(我是熊猫的新手)usecols
0赞 WoJ 9/14/2023
是的,我现在在这个问题中澄清了这一点
0赞 WoJ 9/14/2023
感谢您更改标题,现在好多了
1赞 Timeless 9/14/2023 #2

IIUC,您可以尝试在read_csv中设置正则表达式作为分隔符:

N = 4 # Which col ? Fourth.

pat = r"{}(.+)".format("(?:\S+)\s+"*(N-1))

col = pd.read_csv("file.txt", sep=pat, header=None, engine="python")[1]

演示 : [Regex]

输出:

print(col)

0                                                   ddd
1    ppp sjkhdkjsh skdjhsksdkskjdh  ksjh sdkjsdh  ksjdh
2                                                   iii
Name: 1, dtype: object
0赞 PaulS 9/14/2023 #3

另一种可能的解决方案是将 CSV 文件读取到单列数据帧中(因此,用作文本文件中不存在的分隔符),然后将单列拆分为 4 列。\t+

data = """aaax bbb ccc ddd
mmmxxx nnn ooo ppp sjkhdkjsh skdjhsksdkskjdh  ksjh sdkjsdh  ksjdh
fffxx ggg hhh iii
"""

N = 3

df = pd.read_csv(StringIO(data), sep='\t+', header=None, engine='python')
df[0].str.split(n=N, expand=True)

输出:

        0    1    2                                                  3
0    aaax  bbb  ccc                                                ddd
1  mmmxxx  nnn  ooo  ppp sjkhdkjsh skdjhsksdkskjdh  ksjh sdkjsdh  k...
2   fffxx  ggg  hhh                                                iii