熊猫:groupby并创建一个新的列,将聚合应用于两个列

时间:2018-08-07 18:50:31

标签: python pandas group-by aggregate

我很难将agg应用于groupby熊猫数据框。

我有一个像这样的数据框df

order_id    distance_theo    bird_distance 
      10              100               80
      10               80               80
      10               70               80
      11               90               70
      11               70               70
      11               60               70
      12              200              180
      12              150              180
      12              100              180
      12               60              180

我想对order_id进行分组,并通过将每组第一行的crow除以每组第一行的distance_theo来创建新列bird_distance (或在任何行中,因为一组中bird_distance的值只有一个)。

order_id    distance_theo    bird_distance    crow
      10              100               80    1.25
      10               80               80    1.25
      10               70               80    1.25
      11               90               70    1.29
      11               70               70    1.29
      11               60               70    1.29
      12              200              180    1.11
      12              150              180    1.11
      12              100              180    1.11
      12               60              180    1.11

我的尝试: df.groupby('order_id')。agg({'crow',lambda x:x.distance_theo.head(1)/ x.bird_distance.head(1)})

但是我得到一个错误:

'Series' object has no attribute 'distance_theo'

我该如何解决?感谢您提供任何建议!

2 个答案:

答案 0 :(得分:2)

groupbyfirst一起使用:

s = df.groupby('order_id').transform('first')
df.assign(crow=s.distance_theo.div(s.bird_distance))

   order_id  distance_theo  bird_distance      crow
0        10            100             80  1.250000
1        10             80             80  1.250000
2        10             70             80  1.250000
3        11             90             70  1.285714
4        11             70             70  1.285714
5        11             60             70  1.285714
6        12            200            180  1.111111
7        12            150            180  1.111111
8        12            100            180  1.111111
9        12             60            180  1.111111

答案 1 :(得分:1)

您可以在没有groupby的情况下使用drop_duplicatejoin

df.join(df.drop_duplicates('order_id')\
  .eval('crow = distance_theo / bird_distance')[['crow']]).ffill()

或根据以下@jezraela注释使用assign代替eval

df1.join(df1.drop_duplicates('order_id')\
   .assign(crow=df1.distance_theo / df1.bird_distance)[['crow']]).ffill()

输出:

   order_id  distance_theo  bird_distance      crow
0        10            100             80  1.250000
1        10             80             80  1.250000
2        10             70             80  1.250000
3        11             90             70  1.285714
4        11             70             70  1.285714
5        11             60             70  1.285714
6        12            200            180  1.111111
7        12            150            180  1.111111
8        12            100            180  1.111111
9        12             60            180  1.111111