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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

pandas

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

PyCharm

エディター・開発ツール

Q&A

解決済

2回答

1158閲覧

Pythonにおいて指定のフォルダーにある各ファイルに特定の操作を加えた後にひとつに統合する。

Danrussia

総合スコア44

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

pandas

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/04/20 10:27

編集2019/04/22 09:05

前提・実現したいこと

Pythonを使用して、特定のフォルダーの中にある複数のcsvファイル(参考.1)に対して同一な処理(参考.2)を加えた後にひとつのcsvファイルにしたいと思っています。

参考.1

ひとつのフォルダーの中に複数のファイルがある図。
ひとつのフォルダーに複数のcsvファイルがある図

参考.2

横4列,縦100列のデータセットがあります。
列["X"]と["Y"]の最小値から10行刻みで、列["X coordinate"]と["Y coordinate"]を追加した後に数字を割り振っていきたいと思っています。
(例:データ1番目(行)から10番目(行)までは "1",1120までは"2" 2030までは3....)
(下記の「完成させたいデータセット」のようなイメージです)

Python3

1df1 = pd.read_csv(csv_files, encoding="shift-jis") 2df1['X coordinate'] = int() 3df1['Y coordinate'] = int() 4df1['X coordinate'] = (((df1['X'].rank(method='first') + 9) // 10)).astype(int) 5df1['Y coordinate'] = (((df1['Y'].rank(method='first') + 9) // 10)).astype(int)

#[ラベル追加前のラベル]<参考.2>
|Label|X|Y|Sumple|Bean Number|X coordinate|Y coordinate|
|:--|:--: |--:|
#[(ラベル追加後)処理前のデータセット]
|Label|X|Y|Sumple|Bean Number|X coordinate|Y coordinate|
|:--|:--: |--:|
|img061c.jpg|886|3400|くるみ豆|B2|0|0|
|img061c.jpg|899|1730|くるみ豆|B2|0|0|
|img061c.jpg|912|2760|くるみ豆|B2|0|0|
|img061c.jpg|917|4070|くるみ豆|B2|0|0|
|img061c.jpg|920|4750|くるみ豆|B2|0|0|
|img061c.jpg|932|4440|くるみ豆|B2|0|0|
|img061c.jpg|939|2100|くるみ豆|B2|0|0|
|img061c.jpg|943|3690|くるみ豆|B2|0|0|
|img061c.jpg|947|3070|くるみ豆|B2|0|0|
|img061c.jpg|956|2410|くるみ豆|B2|0|0|
|...||||||
|img061c.jpg|3870|4810|くるみ豆|B2|0|0|
|img061c.jpg|3870|3430|くるみ豆|B2|0|0|
|img061c.jpg|3880|4090|くるみ豆|B2|0|0|
|img061c.jpg|3880|3120|くるみ豆|B2|0|0|
|img061c.jpg|3890|4450|くるみ豆|B2|0|0|
|img061c.jpg|3900|2460|くるみ豆|B2|0|0|
|img061c.jpg|3900|2760|くるみ豆|B2|0|0|
|img061c.jpg|3900|2120|くるみ豆|B2|0|0|
|img061c.jpg|3910|3810|くるみ豆|B2|0|0|
|img061c.jpg|3910|1770|くるみ豆|B2|0|0|
|100 rows ×|6columns|

#[処理後のデータセット]<参考.2>
|Label|X|Y|Sumple|Bean Number|X coordinate|Y coordinate|
|:--|:--: |--:|
|img061c.jpg|886|3400|くるみ豆|B2|1|1|
|img061c.jpg|899|1730|くるみ豆|B2|1|1|
|img061c.jpg|912|2760|くるみ豆|B2|1|1|
|img061c.jpg|917|4070|くるみ豆|B2|1|1|
|img061c.jpg|920|4750|くるみ豆|B2|1|1|
|img061c.jpg|932|4440|くるみ豆|B2|1|1|
|img061c.jpg|939|2100|くるみ豆|B2|1|1|
|img061c.jpg|943|3690|くるみ豆|B2|1|1|
|img061c.jpg|947|3070|くるみ豆|B2|1|1|
|img061c.jpg|956|2410|くるみ豆|B2|1|1|
|...||||||
|img061c.jpg|3870|4810|くるみ豆|B2|10|10|
|img061c.jpg|3870|3430|くるみ豆|B2|10|10|
|img061c.jpg|3880|4090|くるみ豆|B2|10|10|
|img061c.jpg|3880|3120|くるみ豆|B2|10|10|
|img061c.jpg|3890|4450|くるみ豆|B2|10|10|
|img061c.jpg|3900|2460|くるみ豆|B2|10|10|
|img061c.jpg|3900|2760|くるみ豆|B2|10|10|
|img061c.jpg|3900|2120|くるみ豆|B2|10|10|
|img061c.jpg|3910|3810|くるみ豆|B2|10|10|
|img061c.jpg|3910|1770|くるみ豆|B2|10|10|
|100 rows ×|6columns|

発生している問題・エラーメッセージ

該当のソースコード2019/04/22 16:00訂正

Python3

1import os 2import pandas as pd 3import numpy as np 4import glob 5os.chdir("C://Users//For Programming//Documents//Python Scripts2") 6list = [] 7filelist = os.listdir() 8for file in filelist: 9 df = pd.read_csv(file,encoding="shift-jis") 10 for g in df: 11 df['X coordinate'] = int() 12 df['Y coordinate'] = int() 13 df['X coordinate'] = (((df['X'].rank(method='first') + 9) //10)).astype(int) 14 df['Y coordinate'] = (((df['Y'].rank(method='first') + 9) //10)).astype(int) 15 df2 = list.append(pd.read_csv(g,encoding="shift-jis")) #ここから上手くlist.apendを使えない。 16 for h in df2: 17 df3 = pd.concat(list) 18df3.to_csv("TOTAL.csv", encoding='shift_jis')

試したこと、実装する上で障害になっている事。2019/04/22 18:00訂正

(恐らくですが)フォルダー内にあるファイルを全て読み込み、特定の操作をかける所までは
上手くいってると思うのですが、特定の操作をかけた後に結果のDataFrame、リストに入れる?部分が上手くいってないです。(「for g in df:」の最終行の部分)

補足情報(FW/ツールのバージョンなど)

Anaconda
Python
Jupyter notebook
Pycharm
お忙しいとは思いますが、よろしくお願いいたします。
情報に不足がありましたら、ご指摘お願いいたします。
ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答2

0

pd.read_csv

の使い方が正しくありません。

pd.read_csvの第1引数にはファイル名を指定します。

df1 = read_csv("data1.csv")

という具合に

ところが、質問のコードでは

csv_files = glob.glob('*.csv')

で得られたファイルパスのリストであるcsv_filesが引数に使われています。

==
csv_filesはリストですから、リストから一つずつファイル名を取り出して、そのファイル(csvファイル)からread_csvでデータフレームを得るというようなコードにする必要があります。

投稿2019/04/20 11:24

coco_bauer

総合スコア6915

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

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

Danrussia

2019/04/20 12:48

回答ありがとうございます。 あきらかに実装の初期段階から派手に躓いているので、頂いた助言を基にもう一度コードを書きなおしてみます。 少し時間が空くかもしれませんが、解決に向かう段階で躓いたらまた質問させていただきます。 コードの不備のご指摘ありがとうございます。
guest

0

ベストアンサー

まず、質問文にツッコミポイントが多いので列挙します。

csvファイルに空白行の['X coordinate']と['Y coordinate']を入れ、df1['X']['Y']とにrank()をかける事によって数字を昇順に並び替え、1から順に番号を振った後に、データ1番目(行)から10番目(行)までは "1",1120までは"2" 2030までは3.... といった形で表示されるようにしたコード

この部分はよくわからないので、説明を改善する必要があると思います。

コードについて。コメントで示します。

python

1import os 2import pandas as pd 3import glob 4 5# エスケープの必要があるのは\で、不要なのは/です 6os.chdir("C://Users\For Programming//Documents//Python Scripts2") 7 8 9csv_files = glob.glob('*.csv') 10lst = [] 11 12def Decision_coordinates(): 13 # read_csvの第一引数にリストは渡せません 14 df1 = pd.read_csv(csv_files, encoding="shift-jis") 15 16 # この2行は下の2行があるなら不要 17 df1['X coordinate'] = int() 18 df1['Y coordinate'] = int() 19 20 # これはいいか・・・ 21 df1['X coordinate'] = (((df1['X'].rank(method='first') + 9) // 10)).astype(int) 22 df1['Y coordinate'] = (((df1['Y'].rank(method='first') + 9) // 10)).astype(int) 23 24# 関数オブジェクトに対してforは回せない。呼び出した結果のつもりだとしても、返り値はないのでできない 25# lstなのかlistなのかはっきりしてください 26for f in Decision_coordinates: 27 # fがファイル名の文字列かファイルオブジェクトになる理由もない 28 list.append(pd.read_table(f, encoding="shift-jis")) 29df = pd.concat(lst) 30df.to_csv("TOTAL.csv", encoding='shift_jis')

コーディングの方針

  1. 1つのDataFrameを引数に取り、意図した通りの処理して結果のDataFrameを返す関数を定義する
  2. glob.globなどを使って処理対象ファイルのリストを作る
  3. 処理対象ファイルのリストをforでループさせ、結果を結果用のlistにでも入れる
  4. 結合

追記

python

1import os 2import pandas as pd 3import numpy as np 4import glob 5os.chdir("C://Users//For Programming//Documents//Python Scripts2") 6list = [] 7filelist = os.listdir() 8for file in filelist: 9 df = pd.read_csv(file,encoding="shift-jis") 10 for g in df: 11 df['X coordinate'] = int() 12 df['Y coordinate'] = int() 13 df['X coordinate'] = (((df['X'].rank(method='first') + 9) //10)).astype(int) 14 df['Y coordinate'] = (((df['Y'].rank(method='first') + 9) //10)).astype(int) 15 df2 = list.append(pd.read_csv(g,encoding="shift-jis")) #ここから上手くlist.apendを使えない。 16 for h in df2: 17 df3 = pd.concat(list) 18df3.to_csv("TOTAL.csv", encoding='shift_jis')

・「 for file in filelist:」のfor文でフォルダー内のファイルを読みこむ事が出来ているのか

これはできています。

・「for g in df:」の操作で、ひとつひとつのファイルに対して指定の処理を加えるのはこのコード合っているのか

できていません。gが一つ一つのファイルになるという認識であれば、間違いです。printして何が出ているのか確認してみてください。

・「for g in df:」の最終行で処理を加えた後に保存?新規?のDataFrameとして処理を反映できてきなのでlist_appendが上手くできていないと思うので、ファイルに処理を加えた後にどのようにコードをしめればいいか。

そのコードを活かしてやるとしたら、こんな感じでいいのではないでしょうか。動くかどうかは確認していません。

python

1lst = [] 2for file in filelist: 3 df = pd.read_csv(file,encoding="shift-jis") 4 df['X coordinate'] = int() 5 df['Y coordinate'] = int() 6 df['X coordinate'] = (((df['X'].rank(method='first') + 9) //10)).astype(int) 7 df['Y coordinate'] = (((df['Y'].rank(method='first') + 9) //10)).astype(int) 8 lst.append(df) 9 10df3 = pd.concat(lst) 11df3.to_csv("TOTAL.csv", encoding='shift_jis')

ちなみに、私が先の回答で書いた関数を定義する方法だと、きっとこんな感じ。

python

1def f(df): 2 df['X coordinate'] = int() 3 df['Y coordinate'] = int() 4 df['X coordinate'] = (((df['X'].rank(method='first') + 9) //10)).astype(int) 5 df['Y coordinate'] = (((df['Y'].rank(method='first') + 9) //10)).astype(int) 6 return df 7 8lst = [] 9for file in filelist: 10 df = pd.read_csv(file,encoding="shift-jis") 11 df = f(df) 12 lst.append(df) 13 14df3 = pd.concat(lst) 15df3.to_csv("TOTAL.csv", encoding='shift_jis') 16

特に本質的な違いはないです。

投稿2019/04/20 11:22

編集2019/04/22 16:05
hayataka2049

総合スコア30933

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

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

Danrussia

2019/04/20 12:40

回答ありがとうございます。「質問文にツッコミポイントが多いので」ということなので、もう少し内容を明確化します。 コーディングの方針を示して頂いたので、その方針にそって進めていきます。 解決できなかった場合はまた後日もう一度、どの点で詰まったかを明確にして質問させてください。 もし無事解決できた場合でも、その事を報告します。 丁寧な指導ありがとうございます、
Danrussia

2019/04/22 09:10

お疲れ様です。一通り自分なりにコードを修正してみたのですが、hayatake2049さんから示して頂いた 1. の部分がうまく実装できませんでした。恐らくcsvファイルを読み込んで、各ファイルに操作を加える所までは成功していると思うのですが、操作を加えた後に保存する?DataFrameにする部分がうまくいかず、次のステップに進めないです。 コードの部分を今現在の状況に書き換えておいたので、お時間がある時にご教授して頂けたら幸いです。
hayataka2049

2019/04/22 09:53 編集

私は1に「関数を定義する」と書いたので、今のところは関数定義のないコードを示されて困惑しています。私の方針は一案なので、それに従えと言っている訳ではありませんが、違う方法で実装してコメントを求めるのであれば、何か説明がほしいなと・・・
Danrussia

2019/04/22 12:47

すいません。「1つのDataFrameを引数に取り、意図した通りの処理して結果のDataFrameを返す関数を定義する」というご助言を頂いたのですが、 ・for文でどうやって自作(特定の操作の)関数を使えば(処理?)良いか ・DataFrameを引数に取って、操作後に結果のDataFrameに入れれば良いか この2点の具体的なイメージが自分の中で全然湧かなかったので、なんとなく自分で勝手に自己解釈してコードを書きなおしました。 知りたい、教えて頂きたい点は ・「 for file in filelist:」のfor文でフォルダー内のファイルを読みこむ事が出来ているのか ・「for g in df:」の操作で、ひとつひとつのファイルに対して指定の処理を加えるのはこのコード合っているのか ・「for g in df:」の最終行で処理を加えた後に保存?新規?のDataFrameとして処理を反映できてきなのでlist_appendが上手くできていないと思うので、ファイルに処理を加えた後にどのようにコードをしめればいいか。 この3点です。本当に質問する内容が漠然で抽象的ですいません。
hayataka2049

2019/04/22 16:07

私がどこまで正確に要件を把握できているかわかりませんが、追記してみました。
Danrussia

2019/04/23 10:27

無事解決する事ができました。 拙い質問の意図をくみ取って答えてくださりありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問