如何使用pandas将一列数据进行分组,创建一个新的百分比列?

4

我有一个看起来像这样的 pandas 数据框:

mydict ={
        'person': ['Jenny', 'Jenny', 'David', 'David', 'Max', 'Max'],
        'fruit': ['Apple', 'Orange', 'Apple', 'Orange', 'Apple', 'Orange'],
        'eaten': [25, 75, 15, 5, 10, 10]
    }

df = pd.DataFrame(mydict) 

    person fruit   eaten
    Jenny  Apple   25
    Jenny  Orange  75
    David  Apple   15
    David  Orange  5
    Max    Apple   10
    Max    Orange  10 

我希望您能够进行翻译,将其转化为:

person  apple_percentage  orange_percentage
Jenny   0.25              0.75
David   0.75              0.25
Max     0.50              0.50

我猜想我需要在某种情况下使用groupby,但无法想出一种干净、Pythonic的方式来实现?

3个回答

6

使用 DataFrame.pivot 并且通过 sum 进行分组:

df = df.pivot('person','fruit','eaten').add_suffix('_percentage')
df = df.div(df.sum(axis=1), axis=0)
print (df)
fruit   Apple_percentage  Orange_percentage
person                                     
David               0.75               0.25
Jenny               0.25               0.75
Max                 0.50               0.50

0
另一个选项是使用pandas的交叉表(crosstab):
(pd.crosstab(index = df.person, 
            columns = df.fruit, 
            values = df.eaten, 
            aggfunc = 'mean', 
            normalize='index')
   .add_suffix('_percentage')
   .rename_axis(columns=None)
)
 
        Apple_percentage  Orange_percentage
person
David               0.75               0.25
Jenny               0.25               0.75
Max                 0.50               0.50

你也可以使用pipe方法,但在这种情况下,它并不能使代码更清晰(这违背了pipe函数的目的):

(df.assign(eaten = df.groupby('person')
                     .pipe(lambda grp: df.eaten / 
                                       grp.eaten.transform('sum'))
           )
  .pivot('person', 'fruit', 'eaten')
  .add_suffix('_percentage')
  .rename_axis(columns=None)
)
        Apple_percentage  Orange_percentage
person
David               0.75               0.25
Jenny               0.25               0.75
Max                 0.50               0.50

-1

可以使用 stack、unstack() 和 agg。

    df=df.set_index(['person','fruit']).stack().unstack('fruit').add_suffix('_percentage')#)

df = df.div(df.sum(axis=1), axis=0).reset_index().drop(columns='level_1')



 fruit person  Apple_percentage  Orange_percentage
0      David              0.75               0.25
1      Jenny              0.25               0.75
2        Max              0.50               0.50

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