2016-06-21 137 views
2

我需要阅读一个.py文件,它有12列总计和数百万行的行。我需要将第2,3列和第4列分为第1列进行计算。因此,在我加载.dat文件之前,是否需要删除所有其他不需要的列?如果不是的话,我该如何选择性地声明该列并请python来完成数学计算?阅读并从python中执行.dat文件的计算

的.dat文件的一个例子是 data.dat

我是新来的蟒蛇,所以有点指令打开,阅读和计算,将不胜感激。

我已经加入我用的是从你的建议的启动代码:

from sys import argv 

import pandas as pd 



script, filename = argv 

txt = open(filename) 

print "Here's your file %r:" % filename 
print txt.read() 

def your_func(row): 
    return row['x-momentum']/row['mass'] 

columns_to_keep = ['mass', 'x-momentum'] 
dataframe = pd.read_csv('~/Pictures', delimiter="," , usecols=columns_to_keep) 
dataframe['new_column'] = dataframe.apply(your_func, axis=1) 

,也是错误我熬过来的:

Traceback (most recent call last): 
    File "flash.py", line 18, in <module> 
    dataframe = pd.read_csv('~/Pictures', delimiter="," , usecols=columns_to_keep) 
    File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 529, in parser_f 
    return _read(filepath_or_buffer, kwds) 
    File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 295, in _read 
    parser = TextFileReader(filepath_or_buffer, **kwds) 
    File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 612, in __init__ 
    self._make_engine(self.engine) 
    File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 747, in _make_engine 
    self._engine = CParserWrapper(self.f, **self.options) 
    File "/home/trina/anaconda2/lib/python2.7/site-packages/pandas/io/parsers.py", line 1119, in __init__ 
    self._reader = _parser.TextReader(src, **kwds) 
    File "pandas/parser.pyx", line 518, in pandas.parser.TextReader.__cinit__ (pandas/parser.c:5030) 
ValueError: No columns to parse from file 
+0

我猜''〜/ Pictures''不包含你要找的数据。尝试阅读正确的文件。 –

+0

我检查了.dat和.py在我的〜/图片文件夹中 – bhjghjh

+1

您是否期待'pandas.read_csv'猜测您想要打开哪个文件?尝试'pd.read_csv('〜/ Pictures/data.dat',delimiter =“,”,usecols = columns_to_keep)''。或者,删除'txt.read()'并将'txt'作为第一个参数传递给'read_csv'。 –

回答

2

看过你的flash.dat文件后,很明显你需要在处理之前做一些清理工作。以下代码将其转换为CSV文件:

import csv 

# read flash.dat to a list of lists 
datContent = [i.strip().split() for i in open("./flash.dat").readlines()] 

# write it as a new CSV file 
with open("./flash.csv", "wb") as f: 
    writer = csv.writer(f) 
    writer.writerows(datContent) 

现在,使用Pandas计算新列。

import pandas as pd 

def your_func(row): 
    return row['x-momentum']/row['mass'] 

columns_to_keep = ['#time', 'x-momentum', 'mass'] 
dataframe = pd.read_csv("./flash.csv", usecols=columns_to_keep) 
dataframe['new_column'] = dataframe.apply(your_func, axis=1) 

print dataframe 
+0

根据docs,','我认为'delimiter'不能',' – ppaulojr

+1

@ppaulojr是默认值。我只是把它包括了,所以很明显它可以改变http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html – Bill

+1

是的,但是因为你正在做一个功能的例子,它会是有趣的是,在他的情况下使用正确的分隔符 – ppaulojr

2

试着这么做:

datContent = [i.strip().split() for i in open("filename.dat").readlines()] 

然后你将你的数据放在一个列表中。

如果您想要更复杂一些,可以使用Pandas,请参阅链接的食谱。

2

考虑使用一般read_table()函数(其中read_csv()是一种特殊类型),其中大熊猫可以很容易地导入该特定.dat文件指定空间分离器,sep='\s+'。另外,逐列计算不需要使用apply()的定义函数。

下面的numpy用于除零的条件。此外,.dat文件的第一列中的例如是#TIME和列2,3,4是的x动量的y动量,和质量(在代码中不同的表达,但根据需要修改)。

import pandas as pd 
import numpy as np 

columns_to_keep = ['#time', 'x-momentum', 'y-momentum', 'mass'] 
df = pd.read_table("flash.dat", sep="\s+", usecols=columns_to_keep) 

df['mass_per_time'] = np.where(df['#time'] > 0, df['mass']/df['#time'], np.nan) 
df['x-momentum_per_time'] = np.where(df['#time'] > 0, df['x-momentum']/df['#time'], np.nan) 
df['y-momentum_per_time'] = np.where(df['#time'] > 0, df['y-momentum']/df['#time'], np.nan) 
1

您在这里遇到的问题是列标题名称中有空格。你需要修正/忽略,使pandas.read_csv表现很好。这将读取列标题名称到基于字段名称字符串的固定长度的列表:

import pandas 

with open('flash.dat') as f: 
    header = f.readline()[2:-1] 
    header_fixed = [header[i*23:(i+1)*23].strip() for i in range(26)] 
    header_fixed[0] = header_fixed[0][1:] # remove '#' from time 

    # pandas doesn't handle "Infinity" properly, read Infinity as NaN, then convert back to infinity 
    df = pandas.read_csv(f, sep='\s+', names=header_fixed, na_values="Infinity") 
    df.fillna(pandas.np.inf, inplace=True) 

# processing 
df['new_column'] = df['x-momentum']/df['mass'] 
1
train=pd.read_csv("Path",sep=" ::",header=None) 

现在您可以访问DAT文件。

train.columns=["A","B","C"]# Number of columns you can see in the dat file. 

然后你可以使用这个作为csv文件。