用一个查询跨pandas数据框的两列执行数学计算?

时间:2019-04-22 23:45:15

标签: python python-3.x pandas

我的问题与上一个问题有关,可能太长了。

因此,我将其分解为简短的组件。

我想对pandas数据框中的多列进行一些计算。

我的桌子:

 id1       date_time               adress       a_size       
 reom      2005-8-20 22:51:10      75157.5413   ceifwekd
 reom      2005-8-20  1:01:25      3571.37946   ceifwekd
 reom      2005-8-20 11:21:01      3571.37946   tnohcve
 reom      2005-8-20  8:29:09      97439.219    tnohcve
 penr      2005-8-20  17:07:16     97439.219    ceifwekd
 penr      2005-8-20  9:10:37      7391.6258    ceifwekd

我需要找到

的比例
 total number of date_time / distinct number of a_size  
 for each id1

我可以通过

  df1 = df.groupby(['id1'])['date_time'].count().to_frame('nums').reset_index()
  df2 = df.groupby(['id1'])['a_size'].nunique().to_frame('dist_num_a_size').reset_index()

  new_df = pd.merge(df1, df2, on = 'id1', how = 'inner')

  new_df['ratio'] = new_df['nums']/new_df['dist_num_a_size']  

如何在一个熊猫查询中做到这一点?

谢谢

3 个答案:

答案 0 :(得分:2)

您可以将groupby.apply与自己定义的lambda function一起使用:

new_df = df.groupby('id1').apply(lambda x: x['date_time'].count() / x['a_size'].nunique())\
           .reset_index()\
           .rename({0:'ratio'},axis=1)

print(new_df)
    id1  ratio
0  penr    2.0
1  reom    2.0

答案 1 :(得分:2)

df['ratio'] = df['id1'].map(df.groupby('id1')\
                              .apply(lambda x: x['date_time'].count() / x['a_size'].nunique()))


    id1     date_time    a_size    ratio
0   reom    2005-8-20   ceifwekd    2.0
1   reom    2005-9-20   ceifwekd    2.0
2   reom    2005-10-20  tnohcve     2.0
3   reom    2005-11-20  tnohcve     2.0
4   penr    2005-12-20  ceifwekd    2.0
5   penr    2005-13-20  ceifwekd    2.0

您可以将groupby与lambda语句一起使用,然后将其映射回id1的

答案 2 :(得分:1)

您可以使用transform

group = df.groupby(['id1'])
df['ratio'] = group['date_time'].transform('count') / group['a_size'].transform('nunique')

    id1     date_time           adress      a_size      ratio
0   reom    2005-8-20 22:51:10  75157.54130 ceifwekd    2.0
1   reom    2005-8-20 1:01:25   3571.37946  ceifwekd    2.0
2   reom    2005-8-20 11:21:01  3571.37946  tnohcve     2.0
3   reom    2005-8-20 8:29:09   97439.21900 tnohcve     2.0
4   penr    2005-8-20 17:07:16  97439.21900 ceifwekd    2.0