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

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

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

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

Q&A

解決済

2回答

838閲覧

python データ抽出 出力

icepenguin

総合スコア3

Python

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

0グッド

0クリップ

投稿2021/07/30 14:00

編集2021/07/31 01:22

環境:windows10 PyCharm2021.1.3

あるフォルダ(input)にある以下のような複数のCSVファイルを読み込み
身長カラムの一定範囲の個数を取得し、
別のCSVファイルとして別フォルダ(output)へ出力したいのですがどのようにすればよろしいでしょうか?

<元データ>ファイル名:Aクラス
身体測定
3月1日
Aクラス
ID sex kg cm
1 男 34 134
2 男 46 121
3 男 54 110
4 男 23 126
5 女 75 164
6 女 34 131
7 女 44 121
8 女 55 151

<出力データ>ファイル名:Aクラス_身長
range cm
0 100-110 0
1 110-120 1
2 120-130 3
3 130-140 2

〇自分で調べたこと
・pandasのインポート
・フォルダ内のCSVのパス取得(出力時のファイル名変更に使用)→glob関数
・CSVファイルの読み込み→read.csv
・フォルダ内すべてのCSVで処理→for文
他にも条件指定による抽出、query関数やcount関数などで調べたのですが、
どのようにコードしたらよいかわからずご質問させていただきました。

何卒ご教授いただければ幸いです。
よろしくお願いいたします

◎追記

import pandas as pd

df = pd.read_csv("./A.csv",header=3)
rannge_110 = (df.query('100 <= cm < 110'))
rannge_120 = (df.query('110 <= cm < 120'))
rannge_130 = (df.query('120 <= cm < 130'))
rannge_140 = (df.query('130 <= cm < 140'))

◎追記2

import pandas as pd
import glob

file = glob.glob('input/*.csv')

df = pd.read_csv("input/A.csv", header=3)
rannge_110 = (df.query('100 <= cm < 110'))
rannge_120 = (df.query('110 <= cm < 120'))
rannge_130 = (df.query('120 <= cm < 130'))
rannge_140 = (df.query('130 <= cm < 140'))

count_110 = (len(rannge_110))
count_120 = (len(rannge_120))
count_130 = (len(rannge_130))
count_140 = (len(rannge_140))

lists = [count_110, count_120, count_130, count_140]

◎追記3(何とか一つのファイルの出力はできました)

import pandas as pd
import glob

file = glob.glob('input/*.csv')

df = pd.read_csv("input/A.csv", header=3)
rannge_110 = (df.query('100 <= cm < 110'))
rannge_120 = (df.query('110 <= cm < 120'))
rannge_130 = (df.query('120 <= cm < 130'))
rannge_140 = (df.query('130 <= cm < 140'))

count_110 = (len(rannge_110))
count_120 = (len(rannge_120))
count_130 = (len(rannge_130))
count_140 = (len(rannge_140))

cm = [count_110, count_120, count_130, count_140]
range = ["110","120","130","140"]
dict = {'range': range,'cm': cm}
df2 = pd.DataFrame(dict)
df2.to_csv('A_output.csv')

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

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

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

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

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

ppaul

2021/07/30 17:37

何が分からないのですか?
y_waiwai

2021/07/30 22:11

まずはご自分が組まれたコードを提示しましょう
meg_

2021/07/31 00:03

> どのようにコードしたらよいかわからずご質問させていただきました。 コードは1行も書けていないのでしょうか?
icepenguin

2021/07/31 00:10

ppaul様、 y_waiwai様 meg_様 曖昧な質問になってしまい大変申し訳ございません。 追加で今の自分ができる限りのコードを記載しました。 まずお伝えし忘れたのですが、 Pythonを始めたばかりの初心者です。 今は一つのCSVファイルを読み込んで中身を確認程度くらいしかできない状態です。
icepenguin

2021/07/31 00:13

◎できないこと ・処理(queryで一定範囲を抽出し、それの個数をカウント) ・あるフォルダから複数のCSVを読み込み同じ処理をする ・処理したものを別のCSVファイルに別々に出力
icepenguin

2021/07/31 00:15

至らない点が多々あり申し訳ございません。 今も検索しながら試行錯誤しているところでございます。 何卒ご教授の程宜しくお願い致します。
icepenguin

2021/07/31 00:20

また、追加したコードですが <元データ>の ファイル名:Aクラス→A カラム:身長→cm に変更してあります。(ここら辺の読み込み設定も勉強不足で…)
meg_

2021/07/31 01:09

> range count 100-110 0 110-120 1 120-130 2 130-140 2 カウント合ってますか?
p19ljk

2021/07/31 01:16

とにかく自力で作ることを目的とするのであれば、dfをループして一つずつ見てカウントしていくという方法もありますが、そうではなく、そういう事はできていてもっとスマートにやりたいということでしょうかね? 練習の意味合いでしたらスマートさは捨てて、とにかく想定した結果が得られるコードを汚くてもいいので作るのがいいと思いますが。
icepenguin

2021/07/31 01:24

meg_様 大変失礼いたしました。 冒頭のデータですが先ほど(修正前)のは例のデータで、自分の打ち込んだもので間違いがございました。 実際にコードで読み込んだデータ、出力できたデータに修正いたしました。
icepenguin

2021/07/31 01:37

p19ljk様 今回質問に使用させていただいたデータは身体測定のデータを使用していますが、 目的といたしましては、実際に業務で機器から出力された大量のCSVファイルのデータ処理や抽出を目指しております。 今回のようにCSVファイル単体の操作は調べながらなんとかできる状態なんですが、 どうしても ・ループ処理(for) ・出力ファイル名に元のファイル名+α(glob?) について調べても理解が難しく躓いてしまっている状態です。 今回の最終的な目標は、 ・書かせていただいたコードを  inputフォルダ内にあるCSVファイル全てに行うこと ・出力するCSVのファイル名を元データ+α(例:Aクラス.csv→Aクラス_処理.csv) にすることです。
guest

回答2

0

ベストアンサー

・csvファイルからの読み込み部分は省力しています。
⇒ カレントディレクトリのcsvファイルから読み込む処理を追記しました。
・処理結果のcsv出力部分は省力しています。

python

1# df1 2# ID 性別 体重 身長 3#0 1 男 34 134 4#1 2 女 44 145 5#2 3 女 46 121 6#3 4 女 54 111 7 8# df2 9# ID 性別 体重 身長 10#0 5 女 23 126 11#1 6 男 75 164 12#2 7 男 34 131 13#3 8 男 44 121 14#4 9 男 55 151 15 16df_list = [df, df2] 17count = {} 18for i in range(100, 140, 10): 19 count[i] = 0 20 21for d in df_list: 22 for i in range(100, 140, 10): 23 count[i] = count[i] + len(d.query('@i <= 身長 < @i+10')) 24 25df3 = pd.DataFrame.from_dict(count, orient='index') 26df3 = df3.reset_index() 27df3.columns = ['range', 'count'] 28df3['range'] = df3['range'].astype(str) 29df3['range'] = df3['range'].apply(lambda x: x + '-' + str(int(x)+10)) 30print(df3) 31# range count 32#0 100-110 0 33#1 110-120 1 34#2 120-130 3 35#3 130-140 2

上記コードは一例です。
分からない箇所は公式ドキュメント等を参照してください。


【追記】

python

1import pandas as pd 2import glob 3 4count = {} 5for i in range(100, 140, 10): 6 count[i] = 0 7 8for file in glob.glob('./*.csv'): 9 df = pd.read_csv(file) 10 for i in range(100, 140, 10): 11 count[i] = count[i] + len(df.query('@i <= 身長 < @i+10'))

投稿2021/07/31 01:32

編集2021/07/31 01:48
meg_

総合スコア10607

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

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

icepenguin

2021/07/31 08:15

ご返事遅れてしまい申し訳ございません。 globやfor分の理解度が上がりました。 また、データ抽出についても、こんなに違う形でも出せることに驚きました。 まだまだ勉強不足のようです。 わからないところを改めて一つ一つ調べてみようと思います。 この度はありがとうございました。
guest

0

データ処理の部分は以下です。

python

1>>> print(df) 2 ID sex kg cm 30 134 134 41 246 121 52 354 110 63 423 126 74 575 164 85 634 131 96 744 121 107 855 151 11>>> print(pd.cut(df['cm'], list(range(100,180,10)), right=False).value_counts(sort=False)) 12[100, 110) 0 13[110, 120) 1 14[120, 130) 3 15[130, 140) 2 16[140, 150) 0 17[150, 160) 1 18[160, 170) 1 19Name: cm, dtype: int64

globの使い方は分かっていますか?

投稿2021/07/31 03:56

ppaul

総合スコア24666

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

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

icepenguin

2021/07/31 08:21

ご返事遅れてしまい申し訳ございません。 こんなに短いコードでも同じような結果だ出せるのですね。 まだまだ勉強不足のようです。 globやfor文の使い方はまだ理解が足りていないようです。 改めて勉強し直し、それでもわからない場合、 こちらのデータ抽出とは別でご質問させていただこうかと思います。 ベストアンサーは、いち早く回答をいただいたmeg_様にさせていただいたのですが、 ppaul様も本当にありがとうございました。 私の質問内容が悪く多くの方にご迷惑をおかけいたしました。 質問方法についても改善していこう思います。 今後ともご縁がございましたら何卒よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問