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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python

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

Q&A

解決済

1回答

474閲覧

解凍先の複数のディレクトリにある特定の名前のtsvファイルで、指定列の条件を満たす数値の数の全ファイルの合計を出したい。

maltines

総合スコア12

Visual Studio Code

Visual Studio Codeとは、Microsoft社が開発したマルチプラットフォーム対応のテキストエディタです。Visual Studioファミリーの一員でもあります。拡張性とカスタマイズ性が高く、テキストエディタでありながら、IDEと遜色ない機能を備えることができます。

Python

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

0グッド

0クリップ

投稿2022/07/28 09:56

編集2022/07/29 03:21

前提

pythonで、ファイルを解凍し、ある特定の名前のtsvファイル(複数ある)の指定列において、条件を満たす数値の数を計算し、それを全てのファイルで合計したい。

実現したいこと

pythonで、

あるディレクトリ内にある複数のtar.gzファイルを全て解凍する

解凍した各tarファイルをそれぞれ元の名前が付けられたディレクトリにいれる

各tarファイルから解凍されたファイルがあるディレクトリから、ある特定の名前のtsvファイルを取り出す

取り出した各ファイルの、指定列の数値を参照する

その列の数値の内、条件を満たす数値の数を数える。

各ファイルで計算したその数値を全て足し合わせる。

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

※ 現在の問題
現在、ループする各ファイルで、指定列の条件を満たす数値が全ファイル分出ています。
最後に、各ファイルで計算されたこの数値を全て足し合わせたものを表示したいのですが、方法が分かりません。

以下、過去のエラーです。既に解決しました。
まず、コードを実行してもvscodeの出力欄に合計数が出力されません。
初心者ですので、コードが間違っているか、vscodeの環境設定が間違っているかわかりません。稚拙な質問で申し訳ございません... *解決済み

※melianさんの助言に基づいたコードの変更後 *解決済み
修正後のエラーメッセージ(このメッセージの前にtsvファイルの内容らしきものがターミナルにあった。)

Traceback (most recent call last): File "c:\case study\apply date check.py", line 16, in <module> aymd = (20210401<= df['app_year_month_day'] <=20210430).sum() File "C:\Py\python39\lib\site-packages\pandas\core\generic.py", line 1527, in __nonzero__ raise ValueError( ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

※ TakaiY さんの一度目の助言に基づいたコードの変更後 *解決済み

FileNotFoundError: [Errno 2] No such file or directory: 'JPWRP_20220413.tar.gz'

このディレクトリ名は後半のfor文の2番目です。エクスプローラーで確認したところ、この名前のフォルダがあったので、なぜこのディレクトリが見つからないと出ているのか分かりません。

※ TakaiY さんの二度目の助言に基づいたコードの変更後 *解決済み
現在、ループする各ファイルで、全ての列で条件を満たす値の数がが出てしまいます。
(1列目=5, 2列目=8,3列目=43,... のような感じで)

これを、指定列(app_year_month_dayの列)のみ表示し、最後に、この各ファイルで計算されたこの指定列の数値を全て足し合わせたものを表示したいのですが、方法が分かりません。

該当のソースコード

python

1import os 2import tarfile 3import glob 4import csv 5os.chdir(r"C:\case study\applying date check") #解凍元があるディレクトリ 6tar_gz_files = glob.glob('*.tar.gz') #拡張子が.tar.gzのファイルを全て捕捉 7 8for file in tar_gz_files: #上記ファイル全てで以下の作業を行なう 9 os.chdir(r"C:\case study\applying date check") #解凍元があるディレクトリに戻る 10 with tarfile.open(file) as tar: #ファイルを解凍 11 tar.extractall('C:\\case study\\after defrost\\'+ file) #解凍元ファイルと同じ名前のディレクトリを作成し解凍先に指定 12 os.chdir(r"C:\case study\after defrost\\" +file +'\\JPWRP') #解凍された中に何故かJPWRPというディレクトリが出来ているため、その中へパスを変更 13 import pandas as pd 14 df= pd.read_csv('upd_mgt_info_p.tsv',delimiter='\t') #目的の名前がついているファイルを読み込む 15 print(df) #読み込んだファイルを表示 16 print(df.columns) #ここがあまり分かっていないが、各列のヘッダーを表示? 17 aymd = ((df['app_year_month_day'] >= 20210401) & (df['app_year_month_day'] <=20210430)).sum() #任意の列において、ある範囲にある数値が何個あるか数える。 18 print('num_data='+str(aymd)) #その指定列に条件を満たす値がいくつあったか表示 19 #最後に各ファイルで計算した値を全て足し合わせ、表示したい 20 21 22

試したこと※現在

前半部分のみ試してみると上手く解凍ファイルが各ディレクトリに収まってました。

後半部分を実行すると、ループする各ファイルで、指定列の条件を満たす数値が全ファイル分出ています。

最後に、この各ファイルで計算されたこの指定列の数値を全て足し合わせたものを表示したいのですが、方法が分かりません。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

melian

2022/07/28 10:06

tar.extractall('C:\\case study\\after defrost\\'+ file) としているので、C:\\case study\\after defrost\\ には TSV ファイルがないはずです。そこには元の 〜.tar.gz という名前の複数のディレクトリがあって、それぞれのディレクトリ名を付けてアクセスする必要があります。
maltines

2022/07/28 10:23

ご助言誠にありがとうございます。変更後エラーが出たので更新させて頂きました。
melian

2022/07/29 03:12

aymd = df[(df['app_year_month_day'] >= 20210401) & ( df['app_year_month_day'] <=20210430)].sum() は、 aymd = ((df['app_year_month_day'] >= 20210401) & (df['app_year_month_day'] <=20210430)).sum() ではないでしょうか。
maltines

2022/07/29 03:22

ご助言誠にありがとうございます。最後の部分の足し合わせる部分が上手くいかず、解決策が分からなかったため、更新させていただきました。
melian

2022/07/29 03:40

例えば sum_aymd という変数を定義しておいて、ループ内で aymd の値を加算していくとよいかと思います。 sum_aymd = 0 for file in tar_gz_files:   :   aymd = ...   sum_aymd += aymd print(sum_aymd)
guest

回答1

0

ベストアンサー

エラーの出ている行はそれはそのエラーの通りだろうというような内容ですよね。

python

1(20210401<= df['app_year_month_day'] <=20210430).sum()

この意味が、もしかして、「dfの app_year_month_day カラムの値がその範囲のもの」を意味するのであれば、

python

1df[(df['app_year_month_day'] >= 20210401) & ( df['app_year_month_day'] <=20210430)].sum()

でしょうね。

これでも、もう一歩だと思いますけど。


python

1for file in tar_gz_files: 2 with tarfile.open(file) as tar: 3 tar.extractall('C:\\case study\\after defrost\\'+ file) 4 os.chdir(r"C:\case study\after defrost\\" +file +'\\JPWRP')

glob.globで取得できるのは、相対パスです。
forループの中で、ディレクトリを移動していますが、元に戻していないので、移動後のディレクトリからの相対パスを探してしまうので、みつかりません。

投稿2022/07/28 12:25

編集2022/07/29 01:50
TakaiY

総合スコア12765

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

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

maltines

2022/07/28 16:04

ご回答ありがとうございます。ご助言通りに改善し、再び別のエラーが出たので更新させていただきます。
TakaiY

2022/07/29 01:51

追記しました。 「ファイルがみつからない」の場合はパスに問題あることが多いです。
maltines

2022/07/29 02:57

何度もご助言ありがとうございます。自分の意図とは異なる結果になったので、更新させていただきました。
TakaiY

2022/07/29 04:09

データフレームの特定のカラムの値を取出す方法がわからないということでしょうか? 基本的な操作なので、検索するなりすれば出てきますので、まずはご自分でやってみては。 合計の出し方にしても、一般的な処理です。 合計用の変数を用意してルーユごとに加算していけばいいのでは。
maltines

2022/07/29 08:49

ご助言ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問