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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

pandas

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

Q&A

解決済

2回答

612閲覧

python:2つのcsvファイルを比較して数値がどこの階級に分類されるか知りたい

bajirisuku

総合スコア4

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

pandas

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

0グッド

0クリップ

投稿2022/12/14 08:03

編集2022/12/14 12:17

前提

対象のデータを過去のデータと照らし合わせる検証を行っている。
進捗としてそれぞれのデータを整理するコードを完成させることができた。

実現したいこと

①のcsvは月ごとにcountを昇順に並び替えたデータである。
月ごとに30個のデータがあり、1~10番目、11~20番目、21~30番目と階級に分けたい。
②が対象のデータとなっており、月ごとに(1月なら1月の)どこの階級に分類されるか教えてくれるプログラムを書きたい。

①                     
date    count    
1993-01-31 24.2
1997-01-31 24.3
2003-01-31 24.3
2011-01-31 24.3
1986-01-31 24.7
... 途中省略
1993-12-31 24.4
2000-12-31 24.4
2009-12-31 24.5
2012-12-31 24.6
1997-12-31 24.8


date    count
2019-01-31 25.9
2019-02-28 28.7
2019-03-31 30.6
2019-04-30 30.9
2019-05-31 29.9
2019-06-30 28.6
2019-07-31 27.9
2019-08-31 27.3
2019-09-30 26.7
2019-10-31 24.9
2019-11-30 23.7
2019-12-31 23.7
2020-01-31 26.3
2020-02-29 28.9
2020-03-31 30.7
2020-04-30 30.6
2020-05-31 29.8
2020-06-30 28.8
2020-07-31 28.4
2020-08-31 27.4
2020-09-30 26.7
2020-10-31 24.7
2020-11-30 23.6
2020-12-31 23.5
2021-01-31 26.1
2021-02-28 27.8
2021-03-31 29.3
2021-04-30 29.1
2021-05-31 29.1
2021-06-30 28.5
2021-07-31 28.0
2021-08-31 27.5
2021-09-30 26.6
2021-10-31 24.7
2021-11-30 23.4
2021-12-31 23.0

試したこと

色々と調べて見たが全く前に進まなかった。
少しでも助言していただけると幸いです。

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

pythonを使って書いています。

サンプルデータとやりたいこと
サンプルデータとやりたいこと

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

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

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

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

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

TakaiY

2022/12/14 08:34 編集

質問の意味がよくわかりません。 > 月ごとに30個のデータ ではなくて、月ごとのデータが30個=30ヶ月分 あるということでしょうか? > 階級に分けたい。 分けられないということでしょうか? 単に10個ずつ階級データを付加すればいいだけでは? > どこの階級に分類されるか 1のデータの何を見て、2のデータの階級を判断するのですか?
can110

2022/12/14 08:49

同じくやりたいことが具体的に理解できませんでした。 - 数行~十数行の単純なサンプルデータと理想の結果 - そのさいどのような手順を行ったのか を記載すると回答得られやすくなるかと思います。
bajirisuku

2022/12/14 09:07

> 月ごとに30個のデータ ではなくて、月ごとのデータが30個=30ヶ月分 あるということでしょうか? A.その通りです。1のデータは月ごとの低い順に並び変えられた30か月分のデータ(1月~12月)があります。 > 階級に分けたい。 分けられないということでしょうか? 単に10個ずつ階級データを付加すればいいだけでは? 分けられていないです。 A.数値を指定して階級を分ける方法は分かりますが、1~10番目、11~20番目、21~30番目といった範囲を指定しての階級の付与の仕方がわかりません。 > どこの階級に分類されるか 1のデータの何を見て、2のデータの階級を判断するのですか? A.1の月ごとの30か月分のデータを低い順に1~10番目、11~20番目、21~30番目と3つの階級に分けます。 次に2のデータを1つずつ見て、1のデータのそれぞれの月に沿って(1月なら1月の)どこの階級に分類されるかを知りたいです。 例えば、②の2019-01-31のデータが①の1月の30個のデータの3つに分けた階級のどこに分類されるかを知りたいということです。
TakaiY

2022/12/14 09:57 編集

解答はここではなく、質問を修正/追記してください。 とはいえ、説明されてもやっぱりやりたいことがよくわかりません。 そもそも、1のデータが質問にすでに10個あるのですから、全部で30個とは思えない。 - 数行~十数行の単純なサンプルデータと理想の結果 - そのさいどのような手順を行ったのか やはり、これがあるといいですね。
TakaiY

2022/12/14 13:00

確認です。 1のデータは、月のデータがそれぞれ30個(30年分)あり、「月ごと」に昇順に並べかえて、10個ずつの階級に分ける。 2のデータのcountは、該当月の階級にあてはめて求める。 ってことですね。
bajirisuku

2022/12/14 13:12

はい、その通りです。 分かり辛く申し訳ないです。
guest

回答2

0

ベストアンサー

python

1import pandas as pd 2import numpy as np 3import io 4 5data1 = ''' 6date,count 71990-01-31,21 81996-01-31,23 91998-01-31,24 101994-01-31,26 112021-01-31,29 121991-01-31,30 131991-02-28,19 141993-02-28,20 151990-02-28,23 161999-02-28,24 172001-02-28,26 181994-02-28,28 19''' 20df1 = pd.read_csv(io.StringIO(data1), parse_dates=['date'], infer_datetime_format=True) 21 22data2 = ''' 23date,count 242019-01-31,24 252019-02-28,21 262020-01-31,22 272020-02-28,25 282021-01-31,28 292021-02-28,30 30''' 31df2 = pd.read_csv(io.StringIO(data2), parse_dates=['date'], infer_datetime_format=True) 32 33# 34region = df1.groupby(df1['date'].dt.month)\ 35 .apply(lambda x: x.groupby(3*x.index//len(x))\ 36 .apply(lambda y: y.iloc[[0,-1]]['count'].values).iloc[1]) 37 38df2['class'] = df2.groupby(df2['date'].dt.month, group_keys=False)['count']\ 39 .apply(lambda x: 40 pd.Series(data=np.where(x <= region[x.name][0], 1, 41 np.where(x >= region[x.name][1], 3, 2)), 42 index=x.index)) 43 44print(df2) 45 46# date count class 47# 0 2019-01-31 24 1 48# 1 2019-02-28 21 1 49# 2 2020-01-31 22 1 50# 3 2020-02-28 25 3 51# 4 2021-01-31 28 3 52# 5 2021-02-28 30 3

投稿2022/12/14 22:58

melian

総合スコア19883

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

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

bajirisuku

2022/12/15 08:41

ありがとうございます。 まだプログラミング始めたてで、コードの説明をもらえると幸いです。
melian

2022/12/15 08:58 編集

region は図の「②の範囲」に相当します(月毎の範囲データ)。そして、df2 を月毎にグループ化して、それぞれのグループでどの範囲にあるのかを調べています。 np.where(x <= region[x.name][0], 1, np.where(x >= region[x.name][1], 3, 2)) ここで、df2 のカウントの値(x)が、 ②の範囲以下 => 1 ②の範囲以上 => 3 ②の範囲内 => 2 としています。
bajirisuku

2022/12/15 09:15

ありがとうございます。 グループの分け方として、月毎の30個のデータを3等分して1つのグループに10個ずつのデータが入っているという解釈でよろしいでしょうか。
melian

2022/12/15 09:19

はい、その通りです。
bajirisuku

2022/12/16 09:40

ありがとうございます。
guest

0

自分ならこうするという構造です。

月ごとの階級2の最初と最後の値を取得します。
まず、最初に作るデータは、リスト1月ごとのcountのリストです。辞書に入れておきます。 dictA = {"01": [1月のcountのリスト], "02":[2月のcountのリスト], ... } という形の辞書

  1. ファイル1を開ける。
  2. 1行ずつ読んで、dateの月の部分を取り出し、dictAの該当するキーのリストを更新/無ければ作る。

そして、階級2の最初と最後の値持つ辞書 dictB = {"01": {'upper': xx, 'lower': yy}, "02": {'upper': xx, 'lower': yy}, ...} を作る。

  1. dictAのそれぞれのキーを取り出し、そのキーのリストをソートする。その11番目と 20番目をとりだして、upperとlowerに設定。

最後に 作った階級2の最初と最後の値持つ辞書 dictBを使ってリスト2の内容をチェックする。

  1. ファイル2を開ける。
  2. 1行ずつ読み込んで、dateの月の部分を取り出す。
  3. 月の部分をキーにして、 dictBから、閾値がわかる。 countと範囲を比べて階級を判定する。

こんな感じですかね。

投稿2022/12/14 14:26

TakaiY

総合スコア12834

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

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

bajirisuku

2022/12/15 08:43

ありがとうございます。 何とかうまくできました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.45%

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

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

質問する

関連した質問