python pandas pivot_table在一列中计算频率

mid*_*uru 17 python pandas

我仍然是Python pandas的pivot_table的新手,想要问一种计算一列中值的频率的方法,该列也链接到另一列ID.DataFrame如下所示.

import pandas as pd
df = pd.DataFrame({'Account_number':[1,1,2,2,2,3,3],
                   'Product':['A', 'A', 'A', 'B', 'B','A', 'B']
                  })
Run Code Online (Sandbox Code Playgroud)

对于输出,我想得到如下内容:

                Product
                A      B
Account_number           
      1         2      0
      2         1      2
      3         1      1
Run Code Online (Sandbox Code Playgroud)

到目前为止,我尝试了这段代码:

df.pivot_table(rows = 'Account_number', cols= 'Product', aggfunc='count')
Run Code Online (Sandbox Code Playgroud)

这段代码给了我两个相同的东西.上面的代码有什么问题?我问这个问题的部分原因是这个DataFrame只是一个例子.我正在处理的真实数据有数万个account_numbers.感谢您的帮助!

And*_*den 24

您需要指定aggfuncas len:

In [11]: df.pivot_table(index='Account_number', columns='Product', 
                        aggfunc=len, fill_value=0)
Out[11]:
Product         A  B
Account_number
1               2  0
2               1  2
3               1  1
Run Code Online (Sandbox Code Playgroud)

它看起来像count,正在计算每列(Account_numberProduct)的实例,我不清楚这是否是一个bug ...


Pag*_*Max 17

在新版本的Pandas中,需要稍加修改.我不得不花一些时间搞清楚,所以只想在这里添加,以便有人可以直接使用它.

df.pivot_table(index='Account_number', columns='Product', aggfunc=len,
               fill_value=0)
Run Code Online (Sandbox Code Playgroud)


Ted*_*rou 11

解决方案:使用aggfunc='size'

使用aggfunc=lenaggfunc='count'类似于此页面上的所有其他答案将不适用于多于三列的DataFrame。默认情况下,pandas会将其应用于aggfunc所有在indexcolumns参数中找不到的列。

例如,如果我们在原始DataFrame中定义了另外两列,如下所示:

df = pd.DataFrame({'Account_number':[1, 1, 2 ,2 ,2 ,3 ,3], 
                   'Product':['A', 'A', 'A', 'B', 'B','A', 'B'], 
                   'Price': [10] * 7,
                   'Quantity': [100] * 7})
Run Code Online (Sandbox Code Playgroud)

输出:

   Account_number Product  Price  Quantity
0               1       A     10       100
1               1       A     10       100
2               2       A     10       100
3               2       B     10       100
4               2       B     10       100
5               3       A     10       100
6               3       B     10       100
Run Code Online (Sandbox Code Playgroud)

如果将当前解决方案应用于此DataFrame,则会得到以下信息:

df.pivot_table(index='Account_number',
               columns='Product',
               aggfunc=len,
               fill_value=0)
Run Code Online (Sandbox Code Playgroud)

输出:

                  Price    Quantity   
Product            A  B        A  B
Account_number                     
1                  2  0        2  0
2                  1  2        1  2
3                  1  1        1  1
Run Code Online (Sandbox Code Playgroud)

而是使用aggfunc='size'。由于size总是为每一列返回相同的数字,因此pandas不会在每一列上都调用它,而只会调用一次。

df.pivot_table(index='Account_number', 
               columns='Product',
               aggfunc='size',
               fill_value=0)
Run Code Online (Sandbox Code Playgroud)

输出:

Product         A  B
Account_number      
1               2  0
2               1  2
3               1  1
Run Code Online (Sandbox Code Playgroud)