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

cx6n0qe3  于 2023-09-27  发布在  其他
关注(0)|答案(2)|浏览(72)

我使用Pandas读取read_csv()文件,其中字段由空格分隔。列数是固定的,但有几行不遵循模式。
到目前为止,我使用的解决方案是添加on_bad_lines='warn',它跳过它们并通知我有一条故障线。
这还可以,虽然有几行我可以单独看。不幸的是,这种线路的数量增加了。
我比较满意的解决方案是只加载10列:第9个总是很好(并且具有可预测的名称),第10个将该行的其余部分作为一列(称为“其他所有内容”)。
我在documentation for 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
kr98yfug

kr98yfug1#

IIUC,您可以尝试在read_csv中设置 regex 作为分隔符:

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
ffx8fchx

ffx8fchx2#

我谦卑的态度:

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

相关问题