2014-12-24 14 views
0

經過幾天的研究,我被卡住了。對Python /熊貓來說是新手。嘗試將多個Excel表單中的數據分析轉換爲Python解決方案。如何在熊貓中進行groupeby計數?

我正在計算新人在特定技能的學習曲線。要做到這一點,我有以下數據集:

  • COMM_ID - 每個通信唯一的數字標識符
  • 技能 - 溝通的範疇 - 文本
  • LOGIN - 登錄的人 - 文本
  • 優惠 - 是一個調查發送,1個或0
  • 反應 - 在那裏調查的響應,1或0
  • NOS - 陰性,響應爲1或0

在下面我建立數據框,按SKill,Login和COMM_ID排序。 COMM_ID按時間順序排列。然後我通過技能和登錄groupby。

我該如何取數據框並將數據剪切成兩個數據框?一個用於響應,另一個用於Nos,每個技能和登錄組合以50個增量爲單位。需要查看50個COMM_ID(50,100,150)的每個段,並計算每個段中有多少個1。這將適用於所有技能/登錄組合。 1的總和然後將進入數據框的每個箱。

我嘗試過pandas.cut的變體,但沒有成功。

import pandas as pd 
import numpy as np 
import odbc 
from pandas import DataFrame 

#Call ODBC connection 
db = odbc.odbc('HID') 

# SQL Query to get data 
sqlRRAgentSkill = """ 
SELECT 
COMM_ID, 
SKILL, 
LOGIN, 
OFFERS, 
RESPONSES, 
NOs 
FROM 
2013_2014; 
""" 

#Call SQL 
RRdata = pd.read_sql_query(sqlRRAgentSkill,db) 

#Sort data 
RRDataSorted = RRdata.sort_index(ascending=[True,True,True], by = ['SKILL', 'LOGIN', 'COMM_ID']) 

# Group data by Skill and Login 
grouped = RRDataSorted.groupby(['SKILL', 'LOGIN']) 

# Bins for contacts 
startBin = 0 
stopBin = 1000 
incrementBin = 50 
sortbins = np.arange(startBin, stopBin + incrementBin, incrementBin) 
+0

和問題是什麼? .. –

+0

對不起,當我寫這篇文章的時候已經很晚了......我編輯了這個問題。 「我如何獲取數據框並將數據剪切成兩個數據框?一個用於響應,另一個用於Nos,對於技能和登錄的每個組合,每個組合的增量爲50。 –

回答

0

想通了。不知道它是否是最乾淨的方式,但它的工作。

內置功能的「計數」列添加到組:

#Add count row to the groups 
def addcount(x): 
    x['COUNTS'] = range(1,x.COMM_ID.count()+1) 
    return x 

應用了該組:

#Insert count row into all groups and recombine 
RRData = grouped.apply(addcount) 

發了「分檔」列並用切給他們組:

#Insert BINS column 
RRData['BINS'] = pd.cut(RRData.COUNTS,sortBins, labels = binLabels) 

二手pivot_table兩次提出兩點分級dataframes:

#Pivot to produce No's Bin table 
Nos = pivot_table(RRData, values = 'NOs', index = ['SKILL', 'LOGIN'], columns = 'BINS', aggfunc = np.sum) 
#Pivot to produce Responses Bin table 
Responses = pivot_table(RRData, values = 'RESPONSES', index = ['SKILL', 'LOGIN'], columns = 'BINS', aggfunc = np.sum) 

要超越我的問題,我再創建衍生第三DF的一個指標,然後做了一個指數復位,以消除多指標:

#Create RR dataframep 
rr = Nos/Responses 
#Reset dataframe index 
rr = rr.reset_index() 
Responses = Responses.reset_index() 
Nos = Nos.reset_index() 

感謝

0

可以使用布爾值索引到一個數據幀列的,像這樣的值過濾:

no = df[df['NOs'] == 1] 
yes = df[df['NOs'] == 0] 

有很多方法將其應用到你的問題,但如果我理解正確的方法 - 遵循你的結構的直接應用會是這樣的:

for _, group in grouped: 
    for row in sortbins: 
     data = group[row: row+50] 
     # filter data here 

你可以閱讀更多有關索引和選擇在這裏:http://pandas.pydata.org/pandas-docs/stable/indexing.html