Python 3.x read_表处理缺少的字符串
在尝试使用pandasPython 3.x read_表处理缺少的字符串,python-3.x,pandas,Python 3.x,Pandas,在尝试使用pandasread_table()从.txt文件导入数据时,我遇到了一个有趣的问题 该文件只包含部分填充字符串的列(OrigVol)。然后用下一列中的值填充空单元格,并在末尾添加NAN,该移位将导致空单元格。下图显示了使用pd.read_表(file.txt,sep=r'\s+')将熊猫作为pd导入后的结果 列OrigVol应包含空字符串或NaN,而不是列prim\u pos\u eutags。 我是熊猫的新手,很难想出一个能准确再现这个问题的MWE。你需要这个文件(我无法上传)
read_table()
从.txt文件导入数据时,我遇到了一个有趣的问题
该文件只包含部分填充字符串的列(OrigVol)。然后用下一列中的值填充空单元格,并在末尾添加NAN,该移位将导致空单元格。下图显示了使用pd.read_表(file.txt,sep=r'\s+')
将熊猫作为pd导入后的结果
列OrigVol应包含空字符串或NaN,而不是列prim\u pos\u eutags。
我是熊猫的新手,很难想出一个能准确再现这个问题的MWE。你需要这个文件(我无法上传)
可能我没有指定导入选项。如果需要更多信息,请告诉我
任何提示都将不胜感激
根据建议,我提供了一个示例文件的前8行
Name Subtype ProcName Material Creator OrigVol trklen prim_pos_eutags
top 0 initStep undefined undefined top 0 prim_pos_eudata
top 91 Transportation Vacuum undefined 2.27009877562523E-12 prim_pos_eudata
QC5L_2_v 91 Transportation Vacuum undefined 3.50000000000227 prim_pos_eudata
DRIFT_8609_v 91 Transportation Vacuum undefined 3.80000000000518 prim_pos_eudata
BC1L_2_v 23 SynRad Vacuum undefined 68.1607816456518 prim_pos_eudata
BC1L_2_v 91 Transportation Vacuum undefined 79.0910350747966 prim_pos_eudata
DRIFT_8610_v 91 Transportation Vacuum undefined QC2_v 79.3910346856657 prim_pos_eudata
列之间用不同数量的空格分隔,以使列在文本文件中看起来美观并对齐。您可以做的是逐行读取文件,拆分该行,然后查看使用
line.split()
生成的列表中的元素数是否小于列数。如果是,则在所需索引处添加空字符串
input_file = open('test.txt', "rb")
data = []
for line in input_file:
splitted_list = line.split()
if len(splitted_list) < 8: # 8 is number of columns, change it if it is wrong
splitted_list.insert(5, "") # add an empty string inn the 5th column (change the number if it is wrong)
data.append(splitted_list)
df = pd.DataFrame.from_records(data)
input_file=open('test.txt',“rb”)
数据=[]
对于输入_文件中的行:
splitted_list=line.split()
如果len(splitted_list)<8:#8是列数,如果错误,请更改它
拆分列表。插入(5,“”)#在第5列中添加一个空字符串(如果数字错误,请更改数字)
data.append(拆分的_列表)
df=pd.DataFrame.from_记录(数据)
多亏了的建议,问题才得以解决
然而,我做了一些小的修改,以获得一个干净的数据帧,第一行作为标题
input_file = open('test.txt', "r")
data = []
for line in input_file:
splitted_list = line.split()
if len(splitted_list) == 8: data.append( splitted_list )
if len(splitted_list) < 8: # 8 is number of columns, change it if it is wrong
splitted_list.insert(5, "") # add an empty string inn the 5th column (change the number if it is wrong)
data.append(splitted_list)
test = pd.DataFrame.from_records( data )
# first row to select header
header = test.iloc[0]
# exclude first line
test = test[1:]
# reset the header
test.columns = header
test
input_file=open('test.txt',“r”)
数据=[]
对于输入_文件中的行:
splitted_list=line.split()
如果len(分割的_列表)==8:data.append(分割的_列表)
如果len(splitted_list)<8:#8是列数,如果错误,请更改它
拆分列表。插入(5,“”)#在第5列中添加一个空字符串(如果数字错误,请更改数字)
data.append(拆分的_列表)
测试=来自_记录(数据)的pd.DataFrame
#选择标题的第一行
header=test.iloc[0]
#排除第一行
测试=测试[1:]
#重置标题
test.columns=标题
测验
Hi-谢谢您提供的信息。我已经怀疑它可能与指定的分隔符有关。然而,我担心,退回到一个空白处恐怕不会起作用。通常,在整个文件中,多个空格用作分隔符。谢谢通知。您是否检查了”\s
?如果是,您能否共享至少一行数据?是否可以更改一些值,然后共享?胡乱猜测是非常困难的。使用'
以及\s
进行简单检查似乎不起作用。我提供了一个示例文件作为对我的原始帖子的编辑。胡乱猜测确实没有多大帮助;)谢谢。是的,刚刚检查过,很遗憾这是一个数据采集的坏例子。列之间用不同数量的空格分隔,以使列在文本文件中看起来美观并对齐。仍在考虑如何处理此案。它是唯一缺少值的列吗?如果是这样的话,可以考虑一些黑客攻击。事实上,这并不是数据文件的最佳示例。幸运的是,它是唯一一个部分没有数据的列。