我正在计算特定技能的新人的学习曲线。为此,我有以下数据集:
在下面我构建数据框,按SKill,Login和COMM_ID排序。 COMM_ID按时间顺序排列。然后我通过Skill和Login进行分组。
我如何获取数据帧并将数据切割成两个数据帧?一个用于响应,另一个用于Nos,用于技能和登录的每个组合,具有50个增量的箱。需要查看50个COMM_ID(50,100,150)的每个段,并计算每个段中有多少1个。这将适用于每个技能/登录组合。然后,1s的SUM将进入每个箱的数据帧。
我尝试过变种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)
您可以使用布尔索引来过滤数据帧列的值,如下所示:
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
答案 1 :(得分:0)
想出来。不确定它是否是最干净的方式,但它有效。
内置功能可添加' COUNT'列的组:
#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)
制作了一个' BINS'列和使用剪切将它们分组:
#Insert BINS column
RRData['BINS'] = pd.cut(RRData.COUNTS,sortBins, labels = binLabels)
使用pivot_table两次制作两个分箱数据帧:
#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()
由于