Dataframe:如何对列中的值进行分组以创建pivot的索引

时间:2017-05-18 14:50:00

标签: python pandas

  

大家好,   我是超级新人,所以我正在寻求帮助。   请考虑以下数据框:

      fruit     sales     price    
0     lemon      ..         .. 
1     orange     ..         ..
2     carrot     ..         .. 
3     potato     ..         .. 
4    pineapple   ..         .. 
5     mango      ..         .. 
  

可以说水果栏可以按以下方式分类:   柠檬+橙=柑橘;   胡萝卜+土豆=块茎;   菠萝+芒果=热带。

     

之后我想用这个新的   分组作为数据透视表的索引。 ,为了看到平均水平   价格或销售的“柑橘/块茎/热带”细分。

     

在数据框架中,我试图应用这个逻辑,因为有太多的值来制作一个ditionary。

     

非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:0)

您可以为map创建dict并使用groupby汇总mean

#sample data
df = pd.DataFrame({
'price': [4, 7, 3, 4, 1, 4], 
'sales': [1, 5, 1, 2, 6, 3], 
'model': ['lemon', 'orange', 'carrot', 'potato', 'pineapple', 'mango']})
print (df)
       model  price  sales
0      lemon      4      1
1     orange      7      5
2     carrot      3      1
3     potato      4      2
4  pineapple      1      6
5      mango      4      3

#dict of mapping
d1 = {'citrus': ['lemon', 'orange'],
      'tuber':['carrot', 'potato'],
       'tropical':['pineapple', 'mango']}
#is necessary swap values with keys and expand them to new dict
d = {k: oldk for oldk, oldv in d1.items() for k in oldv}
print (d)
{'pineapple': 'tropical', 'potato': 'tuber', 'mango': 'tropical', 
'lemon': 'citrus', 'orange': 'citrus', 'carrot': 'tuber'}

s = df['model'].map(d)
df1 = df.groupby(s)['sales'].mean().reset_index()
print (df1)
      model  sales
0    citrus    3.0
1  tropical    4.5
2     tuber    1.5

使用set_index的类似解决方案,但是必须更改列名:

df1 = df.set_index('model').groupby(d)['sales'].mean().reset_index()
df1.columns= ['model','sales']
print (df1)
      model  sales
0    citrus    3.0
1  tropical    4.5
2     tuber    1.5