teratail header banner
teratail header banner
質問するログイン新規登録
Visual Studio Code

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

Python

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

Q&A

解決済

1回答

744閲覧

ファイルを結合し、重複を削除し、指定列の条件を満たすデータ数を数えたい。

maltines

総合スコア12

Visual Studio Code

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

Python

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

0グッド

2クリップ

投稿2022/07/29 08:47

編集2022/07/29 09:08

0

2

前提

ディレクトリの中に同じフォーマットのtsvファイルがあります。1行目にヘッダーがあり、2行目からデータが続いていくような一般的なフォーマットです。Pythonで処理を行っています。

実現したいこと

Pythonで、

ディレクトリにある同じ名前のファイルを取り出す。

同じ名前のファイルを縦方向に結合させる。(1行目のヘッダーは残し、2行目以降は結合元のヘッダーは入れない)

結合したファイルを参照し、ある指定列で重複しているデータがあれば余分な行を削除し一行のみにする

重複がなくなったデータを参照し、別のある指定列において特定の条件を満たすデータ数を数える。

を行いたいです。

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

現在、このエラーが出ます。

KeyError: Index(['app_num'], dtype='object')

app_numは重複を確認して削除する際に参照する行のヘッダーです。

また、

Python

1#重複を確認 2ic.duplicated() 3 4#重複を削除 5sindf = ic.drop_duplicates()

ここの引数を入れずに走らせると、以下のエラーが出ました。

KeyError: 'acai_app_dt'

一番下にこのKeyErrorが出ます。これはある指定列のヘッダーの名前です。ソースコードの一番下の3行に書いてあります。どこで、そしてなぜヘッダーが消えて?しまったのでしょうか。

該当のソースコード

Python

1import os 2import pandas as pd 3import glob 4 5os.chdir(r"C:\case study\after defrost") #目的ファイルのディレクトリがあるパス 6 7# パスで指定したファイルの一覧をリスト形式で取得. 8tsv_files = glob.glob('*/JPWAP/upd_pmac_g_app_case.tsv') 9 10#読み込むファイルのリストを表示 11for a in tsv_files: 12 print(a) 13 14#csvファイルの中身を追加していくリストを用意 15data_list = [] 16 17#読み込むファイルのリストを走査 18for file in tsv_files: 19 data_list.append(pd.read_csv(file,delimiter='\t')) 20 21#リストを全て結合 22cn = pd.concat(data_list) 23 24cn.to_csv("connected.tsv") 25 26hoge = pd.read_csv('connected.tsv',delimiter='\t') 27 28# データフレーム型に格納 29ic = pd.DataFrame(hoge) 30 31#重複を確認 32ic.duplicated('app_num') 33 34#重複を削除 35sindf = ic.drop_duplicates('app_num') 36 37 38# CSVで保存 39sindf.to_csv('upd_pmac_g_app_case.tsv', encoding='utf-8-sig') 40 41df= pd.read_csv('upd_pmac_g_app_case.tsv',delimiter='\t') 42apdt = ((df['acai_app_dt'] >= 20200701) & (df['acai_app_dt'] <=20200731)).sum() #任意の列において、ある範囲にある数値が何個あるか数える。 43print('num_data='+str(apdt)) #各ファイルで条件を満たすものがどれだけあるかを計算

試したこと

結合や重複の際に使った関数にオプションの引数を入れたり抜いたりしましたが、変わりませんでした。

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

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

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

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

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

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

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

TakaiY

2022/07/29 09:50

エラーメッセージは最後だけでなく、全て提示してください。発生箇所や発生理由などの重要な情報がそこに書いてありますので。
guest

回答1

0

ベストアンサー

すべてコードを追っていませんが、以下のところで一度ファイルに書き出して、読込み直してますが、書くときにはカンマ区切りになっているはずなので、読むときに「\t」を設定してしまうと、 1行になってしまうのではないかと。

python

1cn = pd.concat(data_list) 2cn.to_csv("connected.tsv") 3hoge = pd.read_csv('connected.tsv',delimiter='\t')

このあたりで、 cnの 内容・hogeの内容・connected.tsvファイルの内容を確認すればわかるのではないかと。

ちなみに、なぜ読み直してるんですか?

投稿2022/07/29 09:59

TakaiY

総合スコア14545

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問