Python按两个条件分组并计算平均值

4

我有一个如下的数据框。我想按两个条件(列“date”和列“price”)对此数据框进行分组,并添加一列来计算“price2”的平均值(该值具有相同的日期和价格)。谢谢。

import pandas as pd
import numpy as np
df2 = pd.DataFrame({
    'date': [20130101,20130101, 20130105, 20130105, 20130101, 20130108],
    'price': [25, 25, 23.5, 27, 40, 8],
     'price2':[23,56,45,67,33,2]
})
       date  output  price  price2
0  20130101    39.5   25.0      23
1  20130101    39.5   25.0      56
2  20130105    45.0   23.5      45
3  20130105    67.0   27.0      67
4  20130101    33.0   40.0      33
5  20130108     2.0    8.0       2

你能否包含一个期望输出的数据框? - timgeb
2
@U9-Forward 我已经插入了预期输出。 - Hong
1
@timgeb 我已经插入了预期输出。 - Hong
NPE和U9都回答了您的查询,所以您可以选择适合您所需输出的任何一个。 - shiv_90
2个回答

3
尝试使用pandas.DataFrame.groupby.transform来实现此功能:
newdf=df2.groupby(['date','price']).transform('mean')

现在:

print(newdf)

是:

   price2
0    39.5
1    39.5
2    45.0
3    67.0
4    33.0
5     2.0

现在,要获取额外的列,请执行以下操作:
newdf.columns=['output']
newdf=pd.concat([newdf,df2],axis=1)

那么现在:

print(newdf)

是否:

   output      date  price  price2
0    39.5  20130101   25.0      23
1    39.5  20130101   25.0      56
2    45.0  20130105   23.5      45
3    67.0  20130105   27.0      67
4    33.0  20130101   40.0      33
5     2.0  20130108    8.0       2

然后还需要添加:
df2=df2.insert(1, 'output', newdf)

如果想要正确的列索引,可以按照以下方式操作:
现在的方法如下:
print(newdf)

这是:

       date  output  price  price2
0  20130101    39.5   25.0      23
1  20130101    39.5   25.0      56
2  20130105    45.0   23.5      45
3  20130105    67.0   27.0      67
4  20130101    33.0   40.0      33
5  20130108     2.0    8.0       2

1
优雅且适合初学者。+1 - shiv_90
1
考虑使用 df2.insert(1, 'output', newdf) - timgeb
@Shiv_90 谢谢,很高兴它好用且容易(使用 transform - U13-Forward

1
您可以使用pandas的groupby函数:
grp = df2.groupby(['date', 'price']).agg('price2':'mean').rename(columns={'price2':'output'})
pd.merge(df2, grp, on=['date', 'price'])

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接