考虑以下数据框
df = pd.DataFrame({'group1' : ['A', 'A', 'A', 'A',
'A', 'A', 'A', 'A'],
'group2' : ['C', 'C', 'C', 'C',
'C', 'E', 'E', 'E'],
'time' : [-6,-5,-4,-3,-2,-6,-3,-4] ,
'col': [1,2,3,4,5,6,7,8]})
df
Out[36]:
col group1 group2 time
0 1 A C -6
1 2 A C -5
2 3 A C -4
3 4 A C -3
4 5 A C -2
5 6 A E -6
6 7 A E -3
7 8 A E -4
我的目标是创建一个列,其中为['group1','group2']
中的每个组包含col
评估的time = -6
在col
评估的比率除以time = -4
在['A','C']
评估的比率}。
也就是说,对于组['A','E']
,我希望此列等于1/3,对于组group1
,它是6/8。 group1
和 df.groupby(['group1','group2']).transform(lambda x: x.ix[x['time'] == -6,'col'] / x.ix[x['time'] == -4,'col'])
都会在数据中包含许多不同的值。
我怎样才能在熊猫中得到它?
像
这样的东西{
"ts":"2016-07-27T13:06:18.089-05:00",
"logVer":1,
"msg":"123",
"appData":{
"appName":"test",
"action":"SEARCH",
"members":[
{
"id":"999043206",
"dob":"02/23/1984"
}
],
"statusCode":200,
"resultCode":0
}
}
不起作用.. 有什么想法吗?
谢谢!
答案 0 :(得分:4)
你可以不用groupby
这样做:
dfm = pd.merge(df[df.time == -4],df[df.time == -6],on=["group1","group2"])
dfm['Div'] = dfm.col_y.div(dfm.col_x)
df = pd.merge(df,dfm[['group1','group2','Div']],on=["group1","group2"])
输出:
col group1 group2 time Div
0 1 A C -6 0.333333
1 2 A C -5 0.333333
2 3 A C -4 0.333333
3 4 A C -3 0.333333
4 5 A C -2 0.333333
5 6 A E -6 0.750000
6 7 A E -3 0.750000
7 8 A E -4 0.750000
答案 1 :(得分:1)
你的解决方案在一个可笑的长列表迭代(最pythonic方式顺便说一句)。此外,你的问题是有道理的,但你列为1/4的A组,C组的比例实际上是1/3
summary = [(name,group[group.time == -6].col.values[0],group[group.time == -4].col.values[0]) for name,group in df.groupby(['group1','group2'])]
pd.DataFrame(summary, columns=['group', 'numerator', 'denominator'])
答案 2 :(得分:1)