1. ホーム
  2. python

[解決済み] Pythonで.datファイルから読み込んで計算する。

2022-02-16 22:41:04

質問

合計12列、数百万行の行を持つ.datファイルをpythonで読み込む必要があります。私は計算のために列2、3、4と列1を分割する必要があります。そこで、その.datファイルを読み込む前に、他の不要な列をすべて削除する必要があるのでしょうか?もしそうでなければ、どのように列を選択的に宣言し、パイソンに計算を依頼すればよいのでしょうか?

.dat ファイルの例は次のとおりです。 data.dat

私はpythonの初心者なので、開く、読む、計算するための少しの指示をお願いします。

ご指摘を受け、手始めに私が使っているコードを追加しました。

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

解決方法は?

を見た後 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