質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

1535閲覧

pandas以外を使った処理の仕方がわからない

pcbginer

総合スコア25

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/12/05 16:33

現状

pandasを使用して、csvファイルを読み込み、id列のidが同じ時、計算処理をするプログラム
を作成した。

問題

しかし、上司から後から、1行ずつ読み込めるプログラムを作れと言われた。
pandasだと1行ずつ読み込むのは難しいとwebサイトで読んだ。

前のプログラム

python

1import pandas as pd 2 3#引数 4ip = input("計算するcsvファイル名を入力してください(例:test5.csv):") 5print(ip) 6distance = int(input("距離を入力してください(メートル):")) 7print(distance) 8mes = int(input("計算するスピードの単位を決めてください 1:時速 2:分速 3:秒速 ")) 9 10 11#csvファイルの読み込み 12df = pd.read_csv(f"./{ip}", parse_dates=['datetime']) 13 14 15#idが同じのがあったら、mesの値によって求める 16if(mes == 1): 17 df['speed'] = df.groupby('id')['datetime'].apply(lambda d: distance / d.diff().shift(-1).dt.total_seconds()); 18 df['speed'] /= 3600; 19elif(mes == 2): 20 df['speed'] = df.groupby('id')['datetime'].apply(lambda d: distance / d.diff().shift(-1).dt.total_seconds()); 21 df['speed'] /= 60; 22elif(mes == 3): 23 df['speed'] = df.groupby('id')['datetime'].apply(lambda d: distance / d.diff().shift(-1).dt.total_seconds()); 24 25else: 26 print("正しい値を入力してください"); 27 pass; 28 29 30#csvファイルをスピードを表示したもの以外削除する 31df2 = df.dropna(how='any') 32print(df2) 33 34#csvファイルの書きだし(秒速の値をcsvファイルに書き込む) 35df2.to_csv('test4.csv')

前のプログラムを実行した時のターミナル

terminal

1TestuserMacBook-Pro:Desktop test$ python test5.py 2計算するcsvファイル名を入力してください(例:test5.csv):test6.csv 3test6.csv 4距離を入力してください(メートル):45 545 6計算するスピードの単位を決めてください 1:時速 2:分速 3:秒速 1 7 datetime label direction id x y w h speed 80 2019-02-21 17:15:14.500 車線1 right 9 719 407 147 175 0.010417 93 2019-02-21 17:16:11.600 車線1 right 213 746 504 141 142 0.011364 106 2019-02-21 17:19:10.300 車線1 right 533 851 396 140 161 0.011364 11TestuserMacBook-Pro:Desktop test$ 12

今作りかけのプログラム

python

1import csv 2a = input("計算するcsvファイル名を入力してください(例:test5.csv):") 3with open(a, newline='') as csvfile: 4 reader = csv.DictReader(csvfile) 5 for row in reader: 6 print(row['id'], row['datetime']) 7

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Takumiboo

2019/12/05 16:43 編集

質問は何でしょう。 csvは1行1データで、列がカンマで区切られているだけなので、最悪一から読むプログラムも書けるでしょう。
shiracamus

2019/12/05 22:21

平均を計算するには全データを溜め込む必要があるので、1行ずつ読むプログラムにする意味がありません。 その点は上司は何といっているのでしょう? Pythonの勉強をさせたいから基本機能だけで作るように言われたのでしょうか?
pcbginer

2019/12/05 23:24

メモリが足りなくなると言われたのですが、私はpandasはデータ解析用なので、する必要が無いと思いますが、どう思われますか?
magichan

2019/12/05 23:57

pandas は通常データフレームをメモリ上に展開するので、データが大きいとそれなりにメモリーを圧迫しますが、扱うデータはメモリーに乗らないほど巨大な(数GB?)データなのですか?
pcbginer

2019/12/06 00:00

メモリ容量も、データ数も説明させていなくいきなり書き換えろと言われました。とても今度に不安を感じています。何万のデータ数を扱う場合は、どうプログラムを書き換えればいいでしょうか?
Takumiboo

2019/12/06 00:14

だったら上司にその不安を伝えたら良いのではないですか。
shiracamus

2019/12/06 01:20

メモリサイズはそんなに変わらないと思うけどなぁ・・・ データを読み込んだ時点でキー入力待ちにして、プロセスのメモリサイズを比較してみるとか。 with open(csvfile) as lines: data = [[line.split(',') for line in lines] で二次元配列データになります。 そこから、id列とspeed列を取り出したり、idの出現数をカウントしたり、もっとメモリが必要になるはず。
guest

回答1

0

ベストアンサー

なんとなく上司のやりたいことがわかったような・・・
2組登場するごとにデータ処理したいということなのかな?

python

1from dateutil.parser import parse 2 3filename = input("計算するcsvファイル名を入力してください(例:test5.csv):") 4distance = int(input("距離を入力してください(メートル):")) 5unit = input("計算するスピードの単位を決めてください 1:時速 2:分速 3:秒速 ") 6 7UNITS = {"1": 3600, "2": 60, "3": 1} 8if unit not in UNITS: 9 print("正しい値を入力してください"); 10 exit(); 11unit = UNITS[unit] 12 13HEADER_OF_ID = 'id' 14HEADER_OF_TIME = 'datetime' 15 16id_time = {} 17with open(f"./{filename}") as lines: 18 header = next(lines).split(',') 19 ID = header.index(HEADER_OF_ID) 20 TIME = header.index(HEADER_OF_TIME) 21 for line in lines: 22 items = line.split(',') 23 id_ = items[ID] 24 time = parse(items[TIME]) 25 if id_ in id_time: 26 print(id_, distance / ((time - id_time[id_]).seconds / unit)) 27 del id_time[id_] 28 else: 29 id_time[id_] = time

ファイル書き出し例

python

1import csv 2from dateutil.parser import parse 3 4filename = input("計算するcsvファイル名を入力してください(例:test5.csv):") 5distance = int(input("距離を入力してください(メートル):")) 6unit = input("計算するスピードの単位を決めてください 1:時速 2:分速 3:秒速 ") 7 8UNITS = {"1": 3600, "2": 60, "3": 1} 9if unit not in UNITS: 10 print("正しい値を入力してください"); 11 exit(); 12unit = UNITS[unit] 13 14HEADER_OF_ID = 'id' 15HEADER_OF_TIME = 'datetime' 16 17def items(): 18 id_time = {} 19 with open(f"./{filename}") as lines: 20 header = next(lines).split(',') 21 ID = header.index(HEADER_OF_ID) 22 TIME = header.index(HEADER_OF_TIME) 23 for line in lines: 24 items = line.split(',') 25 id_ = items[ID] 26 time = parse(items[TIME]) 27 if id_ in id_time: 28 yield (id_, distance / ((time - id_time[id_]).seconds / unit)) 29 del id_time[id_] 30 else: 31 id_time[id_] = time 32 33with open(f"out.csv", "w") as output: 34 writer = csv.writer(output, lineterminator="\n") 35 writer.writerows(items())

投稿2019/12/06 03:07

編集2019/12/08 05:26
shiracamus

総合スコア5406

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pcbginer

2019/12/06 14:26

ご丁寧なご説明ありがとうございました。
pcbginer

2019/12/08 04:03

もう一つ、質問よろしいでしょうか? このプログラムの場合、元のcsvファイルにid_, distance / ((time - id_time[id_]).seconds / unit)だけを 書き込みする場合はどうすればいいでしょうか?
shiracamus

2019/12/08 05:27

回答欄に例を書きました。 読みながら書いているので、同じファイルには書き出せません。 スクリプト実行後にコマンドでファイル名を変更するとかしてください。
pcbginer

2019/12/08 05:28

ありがとうございます! とても助かりました! shiracamusさんがくださったプログラムの内容を勉強して、基礎的な知識をつけていきたいです!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問