提问人:WoJ 提问时间:9/14/2023 最后编辑:MarkWoJ 更新时间:10/27/2023 访问量:95
选择 n 列,将行的其余部分添加到最后一列的末尾,使用 read_csv()
Select n columns, with the rest of line added to the end of the last column, using read_csv()
问:
我正在使用 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
答:
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
评论