PythonPandas:数据透视表:aggfunc连接代替np.size或np.sum

ttcibm8c  于 2023-02-07  发布在  Python
关注(0)|答案(3)|浏览(252)

我在数据框中有一些条目,如:

name, age, phonenumber
 A,10, Phone1
 A,10,Phone2
 B,21,PhoneB1
 B,21,PhoneB2
 C,23,PhoneC

下面是我试图实现的结果透视表:

name, age, phonenumbers, phonenocount
 A,10, "Phone1,Phone2" , 2
 B,21,  "PhoneB1,PhoneB2", 2
 C,23, "PhoneC" , 1

我试着说:

pd.pivot_table(phonedf, index=['name','age','phonenumbers'], values=['phonenumbers'], aggfunc=np.size)

但是我想把电话号码作为aggfunc的一部分连接起来。有什么建议吗?

b0zn9rqh

b0zn9rqh1#

您可以在groupby之后使用agg函数:

df.groupby(['name', 'age'])['phonenumber'].\
    agg({'phonecount': pd.Series.nunique, 
         'phonenumber': lambda x: ','.join(x)
        }
       )

#               phonenumber  phonecount
# name  age     
#    A   10   Phone1,Phone2           2
#    B   21 PhoneB1,PhoneB2           2
#    C   23          PhoneC           1

或者根据@root和@Jon Clements提供的更短版本:

df.groupby(['name', 'age'])['phonenumber'].\
   agg({'phonecount': 'nunique', 'phonenumber': ','.join})
mmvthczy

mmvthczy2#

这个答案来自这里:https://medium.com/@enricobergamini/creating-non-numeric-pivot-tables-with-python-pandas-7aa9dfd788a7
感谢恩里科·贝尔加米尼写了这篇文章。我也在为此而挣扎。
首先定义输入。

df = pd.DataFrame({'name':['a','a','b','b','c'], 
                   'age':[10, 10, 21, 21, 23], 
                   'phonenumber':['phone1', 'phone2', 'phoneb1', 'phoneb2',
                                  'phonec']})

使用Pandaspivot_table可以根据需要重新塑造形状。

temp = pd.pivot_table(df, index=['name', 'age'], values='phonenumber',
                      aggfunc=[len, lambda x: ",".join(str(v) for v in x)])

输出:

len         <lambda>
         phonenumber      phonenumber
name age                             
a    10            2    phone1,phone2
b    21            2  phoneb1,phoneb2
c    23            1           phonec

如果要删除列中的多索引,请使用以下命令:temp.columns = temp.columns.droplevel()
从列索引中删除函数后,可以轻松地重命名它们。

temp.columns = ['count', 'concat']

新存储的变量为:

count           concat
name age                        
a    10       2    phone1,phone2
b    21       2  phoneb1,phoneb2
c    23       1           phonec
g6ll5ycj

g6ll5ycj3#

透视表使用df表示数据,使用phone表示索引,并在字符串变量中连接代码行。

fp=pd.pivot_table(data=df,index=["Phone"],values=["Code"],aggfunc=[len,  lambda x: ", ".join(str(v) for v in x)])
fp.columns =["# of Codes" if str(column)=="('len', 'NewCode')" else str(column) for column in fp.columns.tolist()]
fp.columns =["Spec Code" if str(column)=="('<lambda>', 'NewCode')" else str(column) for column in fp.columns.tolist()]

相关问题