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

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

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

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

pandas

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

Q&A

解決済

3回答

3140閲覧

複数の閾値に基づいたデータ変換

hiroki_0926

総合スコア18

Python 3.x

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

pandas

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

0グッド

0クリップ

投稿2018/02/05 06:26

前提・実現したいこと

データフレームに含まれるデータに対して、複数の閾値を基に別の数値に変換するスクリプトを書いています。
maskやwhereを使って、データ変換を試みてはいるのですが、うまくいかず。
良い方法、ご存知でしょうか?


ex)df
Date A B C D E .....
: : : : : : .....
2017/5/31 -0.79 0.02 0.07 0.31 -1.02 .....
2017/6/30 -1.01 -0.80 -0.11 0.25 1.18 .....
2017/7/31 -0.73 0.50 0.10 0.41 1.19 .....
: : : : : : .....
2017/12/31 -0.31 0.35 0.01 0.61 1.29 .....


ex)閾値条件
値が-0.75未満なら、1
値が-0.75以上-0.25未満なら、2
値が-0.25以上0.25未満なら、3
値が0.25以上0.75未満なら、4
値が0.75以上なら、5
をそれぞれ付与する


単一の条件(例えば、-0.75未満なら1)だった場合、
df1 = df.mask(df >= -0.75)
df_Score1 = df1.mask(df1 < -0.75,1)

で変換できるのですが、複数条件(値が-0.75以上-0.25未満)ではこのやり方が通用しないのではないかと思っています。

補足情報

windows7、python3.6.1を使用しています。

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

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

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

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

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

guest

回答3

0

DataFrame.apply()pandas.cut() を組み合わせる方法もあります。

Python

1import pandas as pd 2import numpy as np 3 4df = pd.DataFrame( 5 [['2017/5/31',-0.79,0.02,0.07,0.31,-1.02], 6 ['2017/6/30',-1.01,-0.80,-0.11, 0.25,1.18], 7 ['2017/7/31',-0.73,0.50,0.10,0.41,1.19], 8 ['2017/12/31',-0.31,0.35,0.01,0.61,1.29]], 9 columns=['Date','A','B','C','D','E']) 10df = df.set_index('Date') 11print(df) 12# A B C D E 13# Date 14# 2017/5/31 -0.79 0.02 0.07 0.31 -1.02 15# 2017/6/30 -1.01 -0.80 -0.11 0.25 1.18 16# 2017/7/31 -0.73 0.50 0.10 0.41 1.19 17# 2017/12/31 -0.31 0.35 0.01 0.61 1.29 18 19df2 = df.apply(lambda ser: pd.cut(ser, [-np.inf,-0.75,-0.25,0.25,0.75,np.inf], labels=[1,2,3,4,5], right=False)) 20print(df2) 21# A B C D E 22# Date 23# 2017/5/31 1 3 3 4 1 24# 2017/6/30 1 1 3 4 5 25# 2017/7/31 2 4 3 4 5 26# 2017/12/31 2 4 3 4 5

ちなみにDataFrame.mask()を使うのであれば

Python

1f_Score2 = df.mask((df >= -0.75) & (df < -0.25), 2)

のように記述することができます

投稿2018/02/05 08:45

magichan

総合スコア15898

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

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

hiroki_0926

2018/02/06 01:57

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

0

ベストアンサー

.applymapによってDate列を除く全データに閾値条件(func)を適用します。

Python

1import pandas as pd 2from io import StringIO 3 4s = """ 5Date,A,B,C 62017/5/31,-0.76,-0.26,0.24 72017/6/30,0.74,0.76,123.456 8""" 9df = pd.read_csv( StringIO(s), sep=",") 10 11def func( v): 12 if v < -0.75: 13 return 1 14 elif v < -0.25: 15 return 2 16 elif v < 0.25: 17 return 3 18 elif v < 0.75: 19 return 4 20 return 5 21 22df.ix[:,1:] = df.ix[:,1:].applymap( func) # A,B,C列~ 23print(df)

投稿2018/02/05 06:56

can110

総合スコア38260

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

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

hiroki_0926

2018/02/06 01:56

ありがとうございます。 教えて頂いたスクリプトを回した結果、値変換されたのですが、 ".ix is deprecated. Please use .iloc for label based indexing or .iloc for positional indexing" というメッセージが出たので、.ilocに書き換えました。
guest

0

-0.75 <= df < -0.25

で良いんじゃないでしょうか?

投稿2018/02/05 06:31

KojiDoi

総合スコア13671

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

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

hiroki_0926

2018/02/06 01:58

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問