跨多列非数字数据创建数据透视表 table
Making a pivot table across multiple columns of non-numeric data
以下代码生成一个虚拟数据帧:
import pandas as pd
df = pd.DataFrame(
{
'user_id': [1,2,3,1,1],
'account_type': ['google','facebook','apple','facebook','google'],
'activated': ['y','pending','n','y','y']
}
)
df.head()
我需要为 account_type
列中的 unique_values 创建一个数据透视表 table,它由 user_id
列聚合。
基本上,对于每个 user_id
,我想查看每种类型的帐户中有多少在 activated
列下具有 n
以外的值。
生成的数据帧应为:
到目前为止我被这个打败了,因为 pivot_table
函数似乎只能使用数值。
尝试通过 groupby()
、where()
和 transform()
方法:
df['count']=(df.groupby(['user_id','account_type'])['activated']
.transform(lambda x:x.where(df['activated'].ne('n')).count()))
最后使用pivot_table()
和rename_axis()
方法:
result=df.pivot_table(index='user_id',columns='account_type',values='count',fill_value=0).rename_axis(columns=None)
result
的输出:
apple facebook google
user_id
1 0 1 2
2 0 1 0
3 0 0 0
使用 DataFrame.assign
for new column filled by mask compared activated
for no n
, and then pivoting by DataFrame.pivot_table
和 aggfunc=sum
计数 True
s:
df = (df.assign(new= df['activated'].ne('n'))
.pivot_table(index='user_id',
columns='account_type',
values='new',
fill_value=0,
aggfunc='sum')
.rename_axis(columns=None))
print (df)
apple facebook google
user_id
1 0 1 2
2 0 1 0
3 0 0 0
以下代码生成一个虚拟数据帧:
import pandas as pd
df = pd.DataFrame(
{
'user_id': [1,2,3,1,1],
'account_type': ['google','facebook','apple','facebook','google'],
'activated': ['y','pending','n','y','y']
}
)
df.head()
我需要为 account_type
列中的 unique_values 创建一个数据透视表 table,它由 user_id
列聚合。
基本上,对于每个 user_id
,我想查看每种类型的帐户中有多少在 activated
列下具有 n
以外的值。
生成的数据帧应为:
到目前为止我被这个打败了,因为 pivot_table
函数似乎只能使用数值。
尝试通过 groupby()
、where()
和 transform()
方法:
df['count']=(df.groupby(['user_id','account_type'])['activated']
.transform(lambda x:x.where(df['activated'].ne('n')).count()))
最后使用pivot_table()
和rename_axis()
方法:
result=df.pivot_table(index='user_id',columns='account_type',values='count',fill_value=0).rename_axis(columns=None)
result
的输出:
apple facebook google
user_id
1 0 1 2
2 0 1 0
3 0 0 0
使用 DataFrame.assign
for new column filled by mask compared activated
for no n
, and then pivoting by DataFrame.pivot_table
和 aggfunc=sum
计数 True
s:
df = (df.assign(new= df['activated'].ne('n'))
.pivot_table(index='user_id',
columns='account_type',
values='new',
fill_value=0,
aggfunc='sum')
.rename_axis(columns=None))
print (df)
apple facebook google
user_id
1 0 1 2
2 0 1 0
3 0 0 0