如何在Pandas组中切片和组合特定的行值?

时间:2016-09-29 13:12:26

标签: python pandas

考虑以下数据框

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 = -6col评估的比率除以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
   }
}

不起作用.. 有什么想法吗?

谢谢!

3 个答案:

答案 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)

groupby与自定义函数结合使用的另一种方法:

def time_selection(row):
    N_r = row.loc[row['time'] == -6, 'col'].squeeze()
    D_r = row.loc[row['time'] == -4, 'col'].squeeze()
    return (N_r/D_r)

pd.merge(df, df.groupby(['group1','group2']).apply(time_selection).reset_index(name='div'))

Image