在pandas Dataframe中创建高级groupby列

时间:2017-01-15 18:50:11

标签: python pandas dataframe grouping

我有一个DataFrame中的星系组目录,'compact',主要包含

  • 组ID('CG',int),
  • 幅度('R',负浮动)
  • 和形态('Morph',字符串,例如' S'或' E')。

我尝试使用以下群组属性构建第二个pandas DataFrame:

  • 'Morph'在组中具有最低'R'的对象
  • 组中第二低和'R'之间的差异
  • 组中最低'R'与组中R之间的差异,定义为-2.5*log10(sum(10**(-0.4*R)))
  • 具有给定'Morph'的对象的比例(例如,在' S'的列上,例如,用于其他形态的对象),不包括具有最低{{1}的一个对象的对象}。

我为最后一个遇到麻烦,你能帮我写一下吗?其他的工作,但作为第二个问题,我想,如果我干净利落,或者做得更好。

这是我的代码(我的最后一栏有一行可行,但没有给出我想要的内容,还有一些不起作用的评论):

'R'

2 个答案:

答案 0 :(得分:2)

首先,如果您提供实际数据或创建一些虚假数据,那就太好了。下面我创建了一些假数据,其中包含5个不同的整数CG组,2种形态(S和E)和'R'的随机负数。

然后我在自定义函数中重做所有聚合,该函数计算一行中4个返回聚合中的每一个,并将结果作为Series发送回来,将每个输出作为行添加到原始DataFrame中。

#create fake data
df = pd.DataFrame({'CG':np.random.randint(0, 5, 100), 'Morph':np.random.choice(['S', 'E'], 100), 'R':np.random.rand(100) * -100})
print(df.head())

   CG Morph          R
0   3     E -72.377887
1   2     E -26.126565
2   0     E  -4.428494
3   0     E  -2.055434
4   4     E -93.341489

# define custom aggregation function
def my_agg(x):
    x = x.sort_values('R')
    morph = x.head(1)['Morph'].values[0]
    diff = x.iloc[0]['R'] - x.iloc[1]['R']
    diff2 = -2.5*np.log10(sum(10**(-0.4*x['R'])))
    prop = (x['Morph'].iloc[1:] == 'S').mean()
    return pd.Series([morph, diff, diff2, prop], index=['morph', 'diff', 'diff2', 'prop'])

# apply custom agg function
df.groupby('CG').apply(my_agg)

   morph       diff      diff2      prop
CG                                      
0      E  -1.562630 -97.676934  0.555556
1      S  -3.228845 -98.398337  0.391304
2      S  -6.537937 -91.092164  0.307692
3      E  -0.023813 -99.919336  0.500000
4      E -11.943842 -99.815734  0.705882

答案 1 :(得分:0)

所以,这是最终的代码,感谢Ted Pertou

# define custom aggregation function
def my_agg(x):
    x = x.sort_values('R')
    morph = x.head(1)['Morph'].values[0]
    diff = x.iloc[1]['R'] - x.iloc[0]['R']
    diff2 =  x.iloc[0]['R'] + 2.5*np.log10(sum(10**(-0.4*x['R'])))
    prop = (x['Morph'].iloc[1:] == 'S').mean()
    return pd.Series([morph, diff, diff2, prop], index=['MorphCen', 'DeltaR12', 'DeltaRGrp1', 'PropS'])

# apply custom agg function
compact.groupby('CG').apply(my_agg)