Python Pandas DF - 将列与另一列的相应频率计数分组

标签 python pandas dataframe pivot-table

我有一个Python数据框。在其中,我有一栏包含不同的人,另一栏包含他们购买的不同产品。 我尝试为每个人创建一个他们购买每种产品的金额的摘要。因此,我尝试按人员和产品进行分组并进行计数,但不知何故我遇到了麻烦。

在下面找到一个小玩具示例。

import pandas as pd

# Create toy data frame
A = [0,0,1,2,2,2,0]
B = ['Person1','Person1','Person1','Person1','Person2','Person2','Person 2']
df = pd.DataFrame([A,B]).transpose()
df.columns = ['cat', 'per']

# Desired Output

          Cat0    Cat1    Cat2
Person 1     2       1       1 
Person 2     1       0       2

最佳答案

您可以先将字符串 cat 添加到值中,但需要通过 astypeint 转换为 str 。然后使用pivot_table最后rename_axis (pandas 0.18.0 中的新功能):

import pandas as pd

# Create toy data frame
A = [0,0,1,2,2,2,0]
B = ['Person1','Person1','Person1','Person1','Person2','Person2','Person2']
df = pd.DataFrame([A,B]).transpose()
df.columns = ['cat', 'per']

print (df)
  cat      per
0   0  Person1
1   0  Person1
2   1  Person1
3   2  Person1
4   2  Person2
5   2  Person2
6   0  Person2

df['cat'] = 'cat' + df.cat.astype(str)
df = df.pivot_table(index='per', columns='cat', aggfunc=len,fill_value=0)

df = df.rename_axis(None).rename_axis(None, axis=1)
#if use older pandas as 0.18.0
#df.columns.name= None
#df.index.name= None

print (df)
         cat0  cat1  cat2
Person1     2     1     1
Person2     1     0     2

关于Python Pandas DF - 将列与另一列的相应频率计数分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37682921/

相关文章:

Python - 将 pcolor 与 panda 数据框一起使用

python - 根据行值条件从数据框中提取列名

python - 复制列表值并将新列添加到数据框

python - 数据框 set_index 未设置

python - 如何命名复杂的正则表达式以便在其他正则表达式中重用

python - 随着应用程序的进展逐步构建一组记录

python - 在 python 中发送 GET 请求的有效负载

python - 这种计算并集和交集的编程方法的正式名称

python - 在 Pandas DataFrame 中将字符串列直接转换为日期格式(不是日期时间)

python - 强制将 DatetimeIndex 与 Pandas 一起使用