繁体   English   中英

在Pandas Dataframe中创建高级分组依据列

[英]Advanced groupby column creation in pandas Dataframe

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

  • 群组ID( 'CG' ,int),
  • 大小( 'R' ,负浮点)
  • 和形态( 'Morph' ,字符串,例如“ S”或“ E”)。

我正在尝试使用组的以下属性构造第二个pandas DataFrame:

  • 组中具有最低'R'的对象的'Morph'
  • 组中第二低和最低'R'之间的差异
  • 组中最低的'R'与组中'R'之间的差,定义为-2.5*log10(sum(10**(-0.4*R)))
  • 组中具有给定'Morph' (例如,“ S”的列,例如其他形态的一个)的对象的比例,而不是具有最低'R'的对象的比例。

我在最后一个方面遇到麻烦,您能帮我写吗? 其他的都可以,但是,作为第二个问题,我想知道是干净的还是更好的方法。

这是我的代码(最后一行的一行有效,但没有给出我想要的内容,而尝试输入注释无效):

GroupBy = compact.sort_values('R').groupby('CG', as_index=False)
R2 = GroupBy.head(2).groupby('CG', as_index=False).last().R
R1 = GroupBy.first().sort_values('CG').R
DeltaR12 =  R2 - R1 
MorphCen = GroupBy.first().sort_values('CG').Morph
Group = GroupBy.first().sort_values('CG').CG
RGroup = GroupBy.apply(lambda x: -2.5*np.log10((10**(-0.4*x.R)).sum()))
DeltaR1gr = R1 - RGroup


# Works, but counts the object with lowest R:
PropS = GroupBy.apply(lambda x: 1.0*x.loc[x['Morph'] == 'S'].shape[0]/x.shape[0])   
# Tries to let aside lowest R, but doesn't work:
# PropS = GroupBy.apply(lambda x: 1.0*x.loc[x['Morph'] == 'S' & 
#                        x['R']>x['R'].min()].shape[0]/x.shape[0])

# PropRed = same than PropS, but for 'Morph' != 'S'

CompactML = pd.DataFrame([Group,MorphCen,DeltaR12,DeltaR1gr]).transpose()
CompactML.columns = ['CG', 'MorphCen', 'DeltaR12','DeltaR1gr']

首先,如果您提供实际数据或创建一些虚假数据,它会很好。 下面,我用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

因此,这是最终代码,这要感谢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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM