我有一个DataFrame中的星系组目录,'compact'
,主要包含
'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'
答案 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)