2017-03-27 8 views
2

次のように私はパンダのデータフレームを持っている:`pandas.cut()`を使用して、ビニングされる列以外の列に基づいてデータをビンする方法は?

import pandas as pd 
import numpy as np 

data = {"first_column": ["item1", "item2", "item3", "item4", "item5", "item6", "item7"], 
     "second_column": ["cat1", "cat1", "cat1", "cat2", "cat2", "cat2", "cat2"], 
     "third_column": [5, 1, 8, 3, 731, 189, 9]} 

df = pd.DataFrame(data) 

df 
    first_column second_column third_column 
0  item1   cat1    5 
1  item2   cat1    1 
2  item3   cat1    8 
3  item4   cat2    3 
4  item5   cat2   731 
5  item6   cat2   189 
6  item7   cat2    9 

さて、私はpandas.cut()を使用して3列目の分類を示す4番目の列を作成したいとしましょう。ここでは、third_columnの要素が10以下であるかどうかを各行にラベルします。<=10

df["less_than_ten"]= pd.cut(df.third_column, [-np.inf, 10, np.inf], labels=(1,0)) 

、そして得られたデータフレームは、以下のようになります。

 first_column second_column third_column less_than_ten 
0  item1   cat1    5    1 
1  item2   cat1    1    1 
2  item3   cat1    8    1 
3  item4   cat2    3    1 
4  item5   cat2   731    0 
5  item6   cat2   189    0 
6  item7   cat2    9    1 

質問:カテゴリcat1cat2と第二のカラムsecond_columnを、注意してください。 pandas.cut()を使用してsecond_columnの「クラス」に基づいてこれらの値を再分類するにはどうすればよいですか?

cat1の場合、third_columnの値に0または1のラベルを付けることができます。< = 10です。 cat2については、third_columnの値で2または3を< = 10(2つのいいえ、3つのはい)とラベルできます。

このデータフレームは、次のようになります。

 first_column second_column third_column less_than_ten 
0  item1   cat1    5    1 
1  item2   cat1    1    1 
2  item3   cat1    8    1 
3  item4   cat2    3    3 
4  item5   cat2   731    2 
5  item6   cat2   189    2 
6  item7   cat2    9    3 

1がこれをどのように行うのですか?私は、他の列のカテゴリ値に基づいて、パンダのデータフレーム内のある列のデータをビニングしています。

答えて

3
  • pd.cutは必要ありません。 <= 10をそのまま使用するか、intとしてキャストしてください。 le(10)は、この場合は<= 10
  • と同義ですが、マップする辞書を作成することができます。それを使用してカテゴリを整数に変換し、次にle(10)
  • assign新しい列に追加できます。あなたもdf['less_than_ten'] =でこれを行っている可能性が、私は

m = dict(cat1=0, cat2=2) 
df.assign(less_than_ten=df.second_column.map(m) + df.third_column.le(10)) 

    first_column second_column third_column less_than_ten 
0  item1   cat1    5    1 
1  item2   cat1    1    1 
2  item3   cat1    8    1 
3  item4   cat2    3    3 
4  item5   cat2   731    2 
5  item6   cat2   189    2 
6  item7   cat2    9    3 
+1

おかげassignが好きです。もっと複雑な区間が必要だとしましょう。 1000 le(1000)以下、20 ge(20)以上です。これはどのようにして行われますか? – ShanZhengYang

+0

この場合、 'pd.cut()'が必要でしょうか? – ShanZhengYang