熊猫-如何对不同的列进行分组以计算各组的平均值?

时间:2020-10-19 12:51:59

标签: python pandas

我无法在线找到解决方案,所以我想知道是否有人有任何想法。

我有3列,一个数值(值)和2个分类列(“水果”和“国家”)。我想为每种分类列组合计算平均值和数字列的总和。

这就是我能做的:

df = pd.DataFrame({'value':[34, 65, 65, 34, 53, 23, 54, 23, 65, 43, 23, 34, 54],'value1':[54, 45, 23, 43, 66, 12, 87, 34, 54, 23, 65, 34, 76], 'fruit': ['Plum', 'Apple', 'Orange', 'Pear', 'Grape', 'Apple', 'Orange', 'Banana', 'Orange', 'Grape', 'Apple', 'Banana', 'Tomato'], 'country': ['USA', 'USA', 'USA', 'UK', 'UK', 'UK', 'CANADA', 'CANADA', 'CANADA', 'USA', 'USA', 'UK', 'USA']})[['value', 'fruit', 'country']]
# print(df)

print(df.groupby(['fruit']).mean()) #sum,etc work great.
            value
fruit            
Apple   37.000000
Banana  28.500000
Grape   48.000000
Orange  61.333333
Pear    34.000000
Plum    34.000000
Tomato  54.000000

它适用于一列,但我想做的是:

  1. 值和value2的均值(我想了解如何基于分组依据进行一次或多次计算)。
  2. 我不仅要按水果分组,而且要对水果/国家/地区进行组合,以便在英国,美国和加拿大这两个葡萄的均值/ value1平均值。

我对如何在groupby中合并多列并进行预突变感到困惑。

这是我失败的尝试-有关如何执行此操作或让我知道什么命令可以执行此操作的任何建议,我将对其进行研究。

from itertools import permutations, combinations

perms = [perm for perm in permutations(df[['fruit', 'country']])]
print(perms) #doesn't work, only results in permutations of words fruit/country so 2 sets.
# [('fruit', 'country'), ('country', 'fruit')]

#trying to create combinations using combinations in itertools
g = df.groupby('fruit').apply(lambda x: 
      pd.Series(list(combinations(x.country, 2))))

df = pd.DataFrame(g.apply(list).tolist(), columns=['country', 'fruit'])
df
#not what I want either this is a combination I was looking for.

# country   fruit
# 0 USA UK
# 1 USA USA
# 2 UK  USA
# 3 CANADA  UK
# 4 UK  USA
# 5 USA CANADA
# 6 USA CANADA
# 7 CANADA  CANADA

3 个答案:

答案 0 :(得分:1)

通过将列表用作df.groupby([col1, col2]),可以在groupby中包括多个列。就您而言,您可以这样做:

df = pd.DataFrame({'value':[34, 65, 65, 34, 53, 23, 54, 23, 65, 43, 23, 34, 54],'value1':[54, 45, 23, 43, 66, 12, 87, 34, 54, 23, 65, 34, 76], 'fruit': ['Plum', 'Apple', 'Orange', 'Pear', 'Grape', 'Apple', 'Orange', 'Banana', 'Orange', 'Grape', 'Apple', 'Banana', 'Tomato'], 'country': ['USA', 'USA', 'USA', 'UK', 'UK', 'UK', 'CANADA', 'CANADA', 'CANADA', 'USA', 'USA', 'UK', 'USA']})

df.groupby(['fruit', 'country']).mean().mean(axis=1)

其中第一个.mean()计算fruitcountry的每个组合的平均值,第二个.mean(axis=1)计算value和{{1 }}。

输出:

value1

答案 1 :(得分:1)

您想要这个:

情况1:按1列分组,valuevalue1的均值:

   In [1018]: df.groupby('fruit').agg({'value': 'mean', 'value1': 'mean'}).reset_index()
Out[1018]: 
    fruit      value     value1
0   Apple  37.000000  40.666667
1  Banana  28.500000  34.000000
2   Grape  48.000000  44.500000
3  Orange  61.333333  54.666667
4    Pear  34.000000  43.000000
5    Plum  34.000000  54.000000
6  Tomato  54.000000  76.000000

案例2:对多个列进行分组并进行计算:

In [1017]: df.groupby(['fruit','country']).agg({'value': 'mean', 'value1': 'mean'}).reset_index()
Out[1017]: 
     fruit country  value  value1
0    Apple      UK   23.0    12.0
1    Apple     USA   44.0    55.0
2   Banana  CANADA   23.0    34.0
3   Banana      UK   34.0    34.0
4    Grape      UK   53.0    66.0
5    Grape     USA   43.0    23.0
6   Orange  CANADA   59.5    70.5
7   Orange     USA   65.0    23.0
8     Pear      UK   34.0    43.0
9     Plum     USA   34.0    54.0
10  Tomato     USA   54.0    76.0

根据OP的评论进行更新:

In [1039]: res =  df.groupby(['fruit','country']).agg({'value': 'mean', 'value1': 'mean'}).reset_index()

In [1041]: res['total'] = res.value + res.value1

In [1042]: res
Out[1042]: 
     fruit country  value  value1  total
0    Apple      UK   23.0    12.0   35.0
1    Apple     USA   44.0    55.0   99.0
2   Banana  CANADA   23.0    34.0   57.0
3   Banana      UK   34.0    34.0   68.0
4    Grape      UK   53.0    66.0  119.0
5    Grape     USA   43.0    23.0   66.0
6   Orange  CANADA   59.5    70.5  130.0
7   Orange     USA   65.0    23.0   88.0
8     Pear      UK   34.0    43.0   77.0
9     Plum     USA   34.0    54.0   88.0
10  Tomato     USA   54.0    76.0  130.0

答案 2 :(得分:0)

您可以使用agg函数对列进行不同的操作

Example: print all keyword-only arguments without default values:

>>>
>>> def foo(a, b, *, c, d=10):
...     pass

>>> sig = signature(foo)
>>> for param in sig.parameters.values():
...     if (param.kind == param.KEYWORD_ONLY and
...                        param.default is param.empty):
...         print('Parameter:', param)
Parameter: c