2016-08-19 56 views
1

我試圖使用來自數據框的兩列中的兩個值並執行qcut分類。使用qcut熊貓進行多重價值分類

單值分類很簡單。但是,兩個變量作爲pair和vs是我想要得到的。

輸入:

date,startTime,endTime,day,c_count,u_count 
2004-01-05,22:00:00,23:00:00,Mon,18944,790 
2004-01-05,23:00:00,00:00:00,Mon,17534,750 
2004-01-06,00:00:00,01:00:00,Tue,17262,747 
2004-01-06,01:00:00,02:00:00,Tue,19072,777 
2004-01-06,02:00:00,03:00:00,Tue,18275,785 
2004-01-06,03:00:00,04:00:00,Tue,13589,757 
2004-01-06,04:00:00,05:00:00,Tue,16053,735 
2004-01-06,05:00:00,06:00:00,Tue,11440,636 
2004-01-06,06:00:00,07:00:00,Tue,5972,513 
2004-01-06,07:00:00,08:00:00,Tue,3424,382 
2004-01-06,08:00:00,09:00:00,Tue,2696,303 
2004-01-06,09:00:00,10:00:00,Tue,2350,262 
2004-01-06,10:00:00,11:00:00,Tue,2309,254 

代碼與純Python,但我試圖做同樣的大熊貓。

for row in csv.reader(inp): 
     if int(row[1])>(0.80*c_count) and int(row[2])>(0.80*u_count): 
      val='highly active' 
     elif int(row[1])>=(0.60*c_count) and int(row[2])<=(0.60*u_count): 
      val='active' 
     elif int(row[1])<=(0.40*c_count) and int(row[2])>=(0.40*u_count): 
      val='event based' 
     elif int(row[1])<(0.20*c_count) and int(row[2])<(0.20*u_count): 
      val ='situational' 
     else: 
      val= 'viewers' 

我在找什麼?

  1. c_countu_count二者
  2. 如同在上面的代碼c_count VS u_count
+0

此數據框中的max_user和max_key是什麼?最後兩列的最大值? – ayhan

+0

@ayhan是的,它們是最後兩列的最大值,並且在顯示的代碼中進行所需的更改以避免混淆。 –

回答

1

可以爲每個位數組創建一個系列:

q = df[['c_count', 'u_count']].apply(lambda x: pd.qcut(x, np.linspace(0, 1, 6), 
                 labels=np.arange(5))) 
q 
Out: 
    c_count u_count 
0  4  4 
1  3  3 
2  3  2 
3  4  4 
4  4  4 
5  2  3 
6  2  2 
7  2  2 
8  1  1 
9  1  1 
10  0  0 
11  0  0 
12  0  0 

0是第一20 %,1爲20%-40%並繼續。

現在if邏輯在這裏有點不同。對於其他部分,首先填充列:

df['val'] = 'viewers' 

如果條件滿足,我們以後做的任何事情都會覆蓋此列中的值。所以我們後面的操作先於前一個。從下到上:

df.ix[(q['c_count'] < 1) & (q['u_count'] < 1), 'val'] = 'situational' 
df.ix[(q['c_count'] < 2) & (q['u_count'] > 1), 'val'] = 'event_based' 
df.ix[(q['c_count'] > 2) & (q['u_count'] < 2), 'val'] = 'active' 
df.ix[(q['c_count'] > 3) & (q['u_count'] > 3), 'val'] = 'highly active' 

第一個條件檢查c_count和u_count是否都在前20%。如果是這樣,請將「val」列中的相應行更改爲情境。其餘的以類似的方式工作。您可能需要稍微調整比較運算符(大於或大於或等於)。

+0

非常感謝你,但是對我來說這似乎有點困惑。 :(是否有可能使它變得更簡單?'df2 ['cat'] = pd.qcut(df2.c_total,q = [0,2.4,.6,.8,1],labels = ['觀衆','基於事件','情境','主動','高度活躍'])'這個我用於單列。這樣的事情? –

+1

這就像滾動的骰子。只有6個可能的結果,但如果你有兩個骰子,結果的數量將是36,如果你看到的是小於或大於條件,那麼這個結果將會更高。因此,無論如何,你需要做一個映射來翻譯你的對Python/Pandas有自己的規則我不知道你是否可以找到比這更簡單的東西 – ayhan

+0

再次感謝你..這一個也有任何可能的建議呢?http://stackoverflow.com/questions/39025705/timeseries-地塊與 - 背景虛化 –