2017-04-08 26 views
1

我有一個熊貓數據幀如下:如何做到比pandas DataFrame大/小於binning?

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()第三列的分類第四列。在這裏,我將每行標註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 

問題:注意第二列second_column,與類別cat1cat2。如何根據second_column中的「班級」使用pandas.cut()重新分類這些值?

更重要的是,假設我想要更復雜的時間間隔,例如,小於或等於500 le(500)且大於或等於20 ge(20)?這將如何完成?在這種情況下,應該通過分組打成1:

df['less_than_ten'] = df.third_column.le(10).astype(np.uint8) 
df.loc[df.second_column=='cat2','less_than_ten'] = \ 
    df.loc[df.second_column=='cat2','third_column'].le(10).astype(np.uint8) + 2 

結果:

In [99]: df 
Out[99]: 
    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

在這種情況下我不會用pd.cut我建議的解決方案看起來像一個黑客,並給出了不同於你的數字,我仍然在這裏提供:

df['less_than_ten'] = (df.second_column=='cat1').astype(int) +\ 
         (df.third_column<10).astype(int) 
# first_column second_column third_column less_than_ten 
#0  item1   cat1    5    2 
#1  item2   cat1    1    2 
#2  item3   cat1    8    2 
#3  item4   cat2    3    1 
#4  item5   cat2   731    0 
#5  item6   cat2   189    0 
#6  item7   cat2    9    1 

只要它們是布爾值(True/False),您可以使括號中的條件任意複雜。

+0

這適用於「少於10」。那麼「少於1000且超過20」呢? – ShanZhengYang

+0

@尚正陽,你能不能相應地更新你的問題?現在還不是很清楚... – MaxU

1

在充分認識到

 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    1 
6  item7   cat2    9    1 
+0

This Works!但是,如果只適用於'df.second_column'的單個值,那麼正確?我需要對'df.second_column =='cat1'','df.second_column =='cat2''等重複此操作。 – ShanZhengYang