根据标准计算出现次数

Counting occurrences based on criterion

我正在尝试计算一种颜色在数据框中出现的总次数,但我只希望它 select 它们符合 selected 标准。 例如我有:

imageName     color1     color2     color3     color4     shape
img1          Red        Red        Red        Red        circle
img2          Blue       Green      Red        Blue       circle
img3          Yellow     Blue       Red        White      square
img4          Blue       Blue       Blue       Blue       circle

我想要 select 所有出现的 'Red' where shape == circle。 我已经尝试过 groupby 但我在概念上遇到了一些问题我应该做什么:

byShape = df.groupby('shape')...

我试过 count() 但它显示了每次在每一列中列出每个形状的总计数。 Pandas中是否有类似于SQL'where'的东西?我想我可能需要对聚合做一些事情,但到目前为止我一直没有成功。

编辑:这就是我得到的 byShape = df.groupby('shape').count()

                      imageName  color1  color2  color3  color4
shape                                                       
cirle                  3         3       3       3       3
square                 1         1       1       1       1

EDIT EDIT:我希望得到这样的最终输出:

 Circle: Red     5
         Blue    6
         Green   1
Square:  Yellow  1
         Blue    1
         Red     1
         White   1  
import pandas as pd

df = pd.DataFrame({'imageName':['img1','img2','img3','img4'],                       
                'color1':['Red','Blue','Yellow','Blue'],
                'color2':['Red','Green','Blue','Blue'],
                'color3':['Red','Red','Red','Blue'],
                'color4':['Red','Blue','White','Blue'],
                'shape':['circle','circle','square','circle']})

df.set_index('imageName',inplace=True)

test = df.set_index('shape').stack()
df1 = pd.DataFrame(test.values,test.index.droplevel(1))
df1.columns = ['Color']
df1['value'] = 1
df1.groupby([df1.index,'Color']).sum()

输出:

               value
shape  Color        
circle Blue        6
       Green       1
       Red         5
square Blue        1
       Red         1
       White       1
       Yellow      1

我会用melt转动框架然后size:

>>> melted = pd.melt(df, id_vars=["imageName", "shape"], value_name="color")
>>> melted.groupby(["shape","color"]).size()
shape   color 
circle  Blue      6
        Green     1
        Red       5
square  Blue      1
        Red       1
        White     1
        Yellow    1
dtype: int64

如果你想要一个框架而不是一个系列,那也很容易:

>>> melted.groupby(["shape","color"]).size().reset_index(name="count")
    shape   color  count
0  circle    Blue      6
1  circle   Green      1
2  circle     Red      5
3  square    Blue      1
4  square     Red      1
5  square   White      1
6  square  Yellow      1

我使用 meltpivot_table

import pandas as pd

df = pd.DataFrame({'color1': {0: 'Red', 1: 'Blue', 2: 'Yellow', 3: 'Blue'}, 'color2': {0: 'Red', 1: 'Green', 2: 'Blue', 3: 'Blue'}, 'color3': {0: 'Red', 1: 'Red', 2: 'Red', 3: 'Blue'}, 'color4': {0: 'Red', 1: 'Blue', 2: 'White', 3: 'Blue'}, 'shape': {0: 'circle', 1: 'circle', 2: ' square', 3: 'circle'}, 'imageName': {0: 'img1', 1: 'img2', 2: 'img3', 3: 'img4'}})
df = df[['shape','color1','color2','color3','color4']]
cheese = pd.melt(df, id_vars=['shape'], value_vars=['color1','color2','color3','color4'])
pvt = pd.pivot_table(cheese, index=['shape', 'value'], aggfunc=len)

print pvt

结果:

                variable
shape   value           
 square Blue           1
        Red            1
        White          1
        Yellow         1
circle  Blue           6
        Green          1
        Red            5

这是 cheese 旋转之前的状态。

      shape variable   value
0    circle   color1     Red
1    circle   color1    Blue
2    square   color1  Yellow
3    circle   color1    Blue
4    circle   color2     Red
5    circle   color2   Green
6    square   color2    Blue
7    circle   color2    Blue
8    circle   color3     Red
9    circle   color3     Red
10   square   color3     Red
11   circle   color3    Blue
12   circle   color4     Red
13   circle   color4    Blue
14   square   color4   White
15   circle   color4    Blue